web-dev-qa-db-ja.com

pandas dfでtimedeltaオブジェクトの平均と標準偏差を見つける

以下に示す2つの列を持つmeanから、timedeltadataframestandard 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()
18
Graham Streich

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

別の解決策は、値をsecondstotal_seconds ですが、正確性は低くなります。

dropped['new'] = dropped['diff'].dt.total_seconds()

means = dropped.groupby('bank').mean()
16
jezrael

timedeltaを前後に変換する必要はありません。 Numpyとpandasを使用すると、シームレスに実行時間を短縮できます。droppedDataFrameを使用する:

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))
6
Wesam

Pandas mean()およびその他の集約メソッドは、numeric_only=Falseパラメーターをサポートします。

dropped.groupby('bank').mean(numeric_only=False)

ここにあります: Python DataFrame のTimedelta値の集計)==

4

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]'})
)
1
Cor