【问题标题】:Fast Pandas.DataFrame multicolumn instantiation快速 Pandas.DataFrame 多列实例化
【发布时间】:2021-08-06 05:04:34
【问题描述】:

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

    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]

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    使用操作员模块中的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)

    【讨论】:

    • 很好地使用运算符! +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 2014-08-29
    相关资源
    最近更新 更多