我想从[{1}}按行计算mean
和standard deviation
的{{1}}和timedelta
,其中两列如下所示。当我运行代码(也显示如下)时,我得到以下错误:
dataframe
我的数据框:
pandas.core.base.DataError: No numeric types to aggregate
我的代码:
bank diff
Bank of Japan 0 days 00:00:57.416000
Reserve Bank of Australia 0 days 00:00:21.452000
Reserve Bank of New Zealand 55 days 12:39:32.269000
U.S. Federal Reserve 8 days 13:27:11.387000
答案 0 :(得分:12)
您需要将timedelta
转换为某个数字值,例如int64
values
最准确的是什么,因为转换为ns
是timedelta
的数字表示形式:
dropped['new'] = dropped['diff'].values.astype(np.int64)
means = dropped.groupby('bank').mean()
means['new'] = pd.to_timedelta(means['new'])
std = dropped.groupby('bank').std()
std['new'] = pd.to_timedelta(std['new'])
另一种解决方案是将值seconds
转换为dropped['new'] = dropped['diff'].dt.total_seconds()
means = dropped.groupby('bank').mean()
,但这不太准确:
{{1}}
答案 1 :(得分:4)
无需来回转换timedelta
。 Numpy和Pandas可以更快地为您无缝完成此操作。使用您的dropped
DataFrame
:
import numpy as np
grouped = dropped.groupby('bank')['diff']
mean = grouped.apply(lambda x: np.mean(x))
std = grouped.apply(lambda x: np.std(x))
答案 2 :(得分:3)
熊猫mean()
和其他聚合方法支持numeric_only=False
参数。
dropped.groupby('bank').mean(numeric_only=False)
在这里找到:Aggregations for Timedelta values in the Python DataFrame
答案 3 :(得分:0)
我建议按照亚历山大·乌西科夫(Alexander Usikov)的说法,将numeric_only=False
参数传递给mean
-这适用于0.20+版本的熊猫。
如果您使用的是旧版本,则可以进行以下操作:
import pandas pd
df = pd.DataFrame({
'td': pd.Series([pd.Timedelta(days=i) for i in range(5)]),
'group': ['a', 'a', 'a', 'b', 'b']
})
(
df
.astype({'td': int}) # convert timedelta to integer (nanoseconds)
.groupby('group')
.mean()
.astype({'td': 'timedelta64[ns]'})
)