以下に示す2つの列を持つmean
から、timedelta
のdataframe
とstandard deviation
を銀行で計算したいと思います。コード(以下にも表示)を実行すると、次のエラーが発生します。
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
私のコード:
means = dropped.groupby('bank').mean()
std = dropped.groupby('bank').std()
timedelta
を数値に変換する必要があります。 int64
by 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
に total_seconds
ですが、正確性は低くなります。
dropped['new'] = dropped['diff'].dt.total_seconds()
means = dropped.groupby('bank').mean()
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))
Pandas mean()
およびその他の集約メソッドは、numeric_only=False
パラメーターをサポートします。
dropped.groupby('bank').mean(numeric_only=False)
ここにあります: Python DataFrame のTimedelta値の集計)==
numeric_only=False
への引数mean
Alexander Usikovによる言及-これはpandasバージョン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]'})
)