Применить функцию к каждому столбцу pandas dataframe без цикла for? - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы преобразовать временные рамки в часы. Я могу сделать это для одной серии (один столбец данных), но я хотел бы найти способ применить его ко всем столбцам.

A 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

Я пытался использовать лямбду, но есть кое-что, что я ошибаюсь:

df = df.apply(lambda x: x/np.timedeltat(1, 'h')).astype(float)

Возвращает ошибку:

AttributeError: ("'module' object has no attribute 'timedelta'", u'occurred at index a')

1 Ответ

0 голосов
/ 03 июля 2018

Использовать np.timedelta64, работая со всеми столбцами, преобразованными в двумерный массив:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...