首页 > 解决方案 > 快速 Pandas.DataFrame 多列实例化

问题描述

我有一些看起来像的代码:

    df['MONTH'] = [df.index[i].month for i in range(len(df))]
    df['WEEK'] = [df.index[i].week for i in range(len(df))]
    df['DAY'] = [df.index[i].day for i in range(len(df))]
    df['HOUR'] = [df.index[i].hour for i in range(len(df))]
    df['MINUTE'] = [df.index[i].minute for i in range(len(df))]

这很慢,因为它运行了 df 的五次。

有没有办法在 1*N 中执行这种方法,将计算时间减少 5 倍?

我在想,比如:

df[['MONTH'],['WEEK'], ...['HOUR']] = [vector assignment]

标签: pythonpython-3.xpandasdataframe

解决方案


attrgetter从操作员模块使用:

import operator

attrs = ['month', 'week', 'day', 'hour', 'minute']

dft = pd.DataFrame(operator.attrgetter(*attrs)(df.index),
                   columns=df.index, index=[c.upper() for c in attrs]).T
df = pd.concat([df, dft], axis='columns')
>>> df
                            A  MONTH  WEEK  DAY  HOUR  MINUTE
2021-08-05 12:43:09  0.081188      8    31    5    12      43
2021-08-07 05:05:09  0.444124      8    31    7     5       5
2021-08-08 21:27:09  0.523709      8    31    8    21      27
2021-08-10 13:49:09  0.544349      8    32   10    13      49

注意FutureWarning

:1: FutureWarning: weekofyear 和 week 已被弃用,请使用 DatetimeIndex.isocalendar().week 代替,它返回一个系列。要准确重现 week 和 weekofyear 的行为并返回索引,您可以调用 pd.Int64Index(idx.isocalendar().week)


推荐阅读