python - 快速 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]
解决方案
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)
推荐阅读
- c++ - Visual Studio 中的冗余查找所有引用输出
- wordpress - 域被重新路由到 wordpress 上的旧服务器
- ios - 使用自定义类以编程方式创建 UIView (Swift 4)
- flutter - 颤振:StreamBuilder 只构建最后一个快照,产生不产生以前的快照
- javascript - 如何在cheerio中没有元素/类的br标签之间嵌套文本?
- javascript - 如何使用 Fetch 在 React 中处理“ECONNREFUSED”?
- javascript - 如何将 frontmatter 字段添加到 TinaCMS 中的现有 Markdown 文件
- php - 将 mqtt 代理连接到同一服务器中的 Web
- java - 使用 java 代码和 Apache CXF 作为 SOAP 客户端时如何实现客户端身份验证?
- java - OffsetTime.parse 导致 ISO_TIME 格式化程序异常