【问题标题】:Apply function to every column of pandas dataframe without for loop?在没有for循环的情况下将函数应用于熊猫数据框的每一列?
【发布时间】:2018-12-11 14:31:09
【问题描述】:

我想将 timedeltas 的数据帧转换为小时。我可以为一个系列(数据框的一列)执行此操作,但我想找到一种方法将其应用于所有列。

for loop 有效,但有没有更快或更 Pythonic 的方法来做到这一点?

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')

【问题讨论】:

    标签: python pandas lambda


    【解决方案1】:

    使用 np.timedelta64 处理所有转换为二维 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
    

    total_seconds:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 2017-08-23
      • 2021-06-16
      • 2018-03-24
      • 1970-01-01
      • 2022-01-08
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多