python - 在没有for循环的情况下将函数应用于熊猫数据框的每一列?
问题描述
我想将 timedeltas 的数据帧转换为小时。我可以为一个系列(数据框的一列)执行此操作,但我想找到一种方法将其应用于所有列。
一个for loop
作品,但有没有更快或更蟒蛇的方式来做到这一点?
import pandas as pd
import datetime
import numpy as np
df = pd.DataFrame({'a': pd.to_timedelta(['0 days 00:00:08','0 days 05:05:00', '0 days 01:01:57']),
'b' : pd.to_timedelta(['0 days 00:44:00','0 days 00:15:00','0 days 01:02:00']),
'c': pd.to_timedelta(['0 days 00:34:33','0 days 04:04:00','0 days 01:31:58'])})
df
a b c
0 00:00:08 00:44:00 00:34:33
1 05:05:00 00:15:00 04:04:00
2 01:01:57 01:02:00 01:31:58
for c in df.columns:
df[c] = (df[c]/np.timedelta64(1,'h')).astype(float)
df
a b c
0 0.002222 0.733333 0.575833
1 5.083333 0.250000 4.066667
2 1.032500 1.033333 1.532778
我尝试过使用 lambda,但我遇到了一些错误:
df = df.apply(lambda x: x/np.timedeltat(1, 'h')).astype(float)
返回错误:
AttributeError: ("'module' object has no attribute 'timedelta'", u'occurred at index a')
解决方案
使用np.timedelta64
转换为 2d numpy 数组的所有列:
df = pd.DataFrame(df.values / np.timedelta64(1, 'h'), columns=df.columns, index=df.index)
print (df)
a b c
0 0.002222 0.733333 0.575833
1 5.083333 0.250000 4.066667
2 1.032500 1.033333 1.532778
如果想使用apply
:
df = df.apply(lambda x: x/np.timedelta64(1, 'h'))
print (df)
a b c
0 0.002222 0.733333 0.575833
1 5.083333 0.250000 4.066667
2 1.032500 1.033333 1.532778
df = df.apply(lambda x: x.dt.total_seconds() / 3600)
print (df)
a b c
0 0.002222 0.733333 0.575833
1 5.083333 0.250000 4.066667
2 1.032500 1.033333 1.532778
推荐阅读
- css - CSS使悬停覆盖活动类
- javascript - 如何触发 JQuery 选项卡元素的点击事件
- r - 按多个组计算跨多个列的最大值
- routing - 具有 Istio Ingress 的 Kubernetes 未在标准 HTTP 端口 443/80 上运行
- php - Laravel Guzzle GET 请求
- vba - 编写循环以将底部 20 行的值设置为 0
- android - 如何通过opencv实时检测人脸?
- javascript - 用于显示修改为与多个唯一 div 一起使用的 div 的 javascript 代码
- javascript - 静态只读成员赋值 => TypeError: XXX is not a constructor
- java - 重新发送到卡夫卡主题时骆驼的无限循环