在 pandas 中对具有重复索引的数据帧应用滚动平均函数
Apply rolling mean function on data frames with duplicated indices in pandas
我很难在以下包含重复索引的数据框中使用 pd.rolling_mean 函数:
amount
20140101 3
20140102 4
20140103 3
20140103 5
20140103 1
20140104 5
20140105 6
20140106 2
…
我需要计算 'amount' 的 3 天平均值,例如 20140101
到 20140103
的平均值应该是 (3+4+3+5+1)/5=3.2
,从 20140104 开始的平均值到 20140106 应该是 (5+6+2)/3=4.3
有人知道怎么做吗?提前致谢!
你可以做到:
>>> df
amount
20140101 3
20140102 4
20140103 3
20140103 5
20140103 1
20140104 5
20140105 6
20140106 2
>>> xf = df.groupby(level=0)['amount'].agg(['sum', 'count'])
>>> xf
sum count
20140101 3 1
20140102 4 1
20140103 9 3
20140104 5 1
20140105 6 1
20140106 2 1
>>> pd.rolling_sum(xf['sum'], 3, 0) / pd.rolling_sum(xf['count'], 3, 0)
20140101 3.000
20140102 3.500
20140103 3.200
20140104 3.600
20140105 4.000
20140106 4.333
dtype: float64
并且 20140103
和 20140106
分别得到 3.2
和 4.3
。
如果您的日期列已经是日期时间并且是索引,您可以调用 rolling_mean
:
In [15]:
pd.rolling_mean(df['amount'], window=1, freq='3d')
Out[15]:
date
2014-01-01 3.200000
2014-01-04 4.333333
Freq: 3D, dtype: float64
如果需要,您可以通过执行以下操作将索引转换为日期时间:
df.index = pd.to_datetime(df.index.astype(str), '%Y%m%d')
这是为了防止索引实际上是 dtype int64,如果它已经是一个字符串,那么您可以忽略 astype
位
我很难在以下包含重复索引的数据框中使用 pd.rolling_mean 函数:
amount
20140101 3
20140102 4
20140103 3
20140103 5
20140103 1
20140104 5
20140105 6
20140106 2
…
我需要计算 'amount' 的 3 天平均值,例如 20140101
到 20140103
的平均值应该是 (3+4+3+5+1)/5=3.2
,从 20140104 开始的平均值到 20140106 应该是 (5+6+2)/3=4.3
有人知道怎么做吗?提前致谢!
你可以做到:
>>> df
amount
20140101 3
20140102 4
20140103 3
20140103 5
20140103 1
20140104 5
20140105 6
20140106 2
>>> xf = df.groupby(level=0)['amount'].agg(['sum', 'count'])
>>> xf
sum count
20140101 3 1
20140102 4 1
20140103 9 3
20140104 5 1
20140105 6 1
20140106 2 1
>>> pd.rolling_sum(xf['sum'], 3, 0) / pd.rolling_sum(xf['count'], 3, 0)
20140101 3.000
20140102 3.500
20140103 3.200
20140104 3.600
20140105 4.000
20140106 4.333
dtype: float64
并且 20140103
和 20140106
分别得到 3.2
和 4.3
。
如果您的日期列已经是日期时间并且是索引,您可以调用 rolling_mean
:
In [15]:
pd.rolling_mean(df['amount'], window=1, freq='3d')
Out[15]:
date
2014-01-01 3.200000
2014-01-04 4.333333
Freq: 3D, dtype: float64
如果需要,您可以通过执行以下操作将索引转换为日期时间:
df.index = pd.to_datetime(df.index.astype(str), '%Y%m%d')
这是为了防止索引实际上是 dtype int64,如果它已经是一个字符串,那么您可以忽略 astype
位