如果满足 2 个条件并且在某个时间段(假设 5 天)内,我想获取之前日期的平均值。
举个例子;如果 2 个条件列是 (1) id 和 (2)country,并且当前行中的值分别是 USA 和 1。然后我想搜索过去 5 天内的其他行,并且这些行中也存在 USA 和 1。
(注意:我想排除当前行的值,只应插入前一行的平均值)。
最后,我想计算这些行的平均值(另一列),并将其插入到当前行的新列中。
我一直在使用一些适用于单个分组列的代码,但不能(按预期)适用于多个列。下面是我正在使用的代码:
import pandas as pd
mydict = {
'date': ['2019-01-01','2019-01-02','2019-01-03','2019-01-04'],
'id':[1,2,2,1],
'country': ['USA','Germany','USA','USA'],
'value': [2,4,5,3],
}
df = pd.DataFrame(mydict)
df['date'] = pd.to_datetime(df['date'])
grouped_by = ['country','id']
df_resampled = df.groupby(grouped_by).apply(lambda x: x.set_index('date').resample('1D').first())
df1 = df_resampled.groupby(level=0)['value']. \
apply(lambda x: x.shift().rolling(min_periods=1, window=5).mean()). \
reset_index(name="previous_5_day_average_value")
merged = pd.merge(df, df1, on=['date','id','country'], how='left')
print(merged)
预期的输出应该是这样的:
date id country value previous_5_day_average_value
0 2019-01-01 1 USA 2 NaN
1 2019-01-02 2 Germany 4 NaN
2 2019-01-03 2 USA 5 NaN
3 2019-01-04 1 USA 3 2
只有最后一行的值应为 2,因为这是在过去 5 天内首次重复国家/地区(美国)和 ID (1)。但是我得到的输出如下:
date id country value previous_5_day_average_value
0 2019-01-01 1 USA 2 NaN
1 2019-01-02 2 Germany 4 NaN
2 2019-01-03 2 USA 5 2.0
3 2019-01-04 1 USA 3 3.5
有人可以帮助我获得所需的输出吗?
最佳答案
初始 df
date id country value
0 2019-01-01 1 USA 2
1 2019-01-02 2 Germany 4
2 2019-01-03 2 USA 5
3 2019-01-04 1 USA 3
4 2019-01-12 1 USA 3
<小时/>
按日期、国家/地区和 ID 创建重新采样 DataFrame
df2 = (df.set_index('date')
.groupby(['country','id'])['country','id']
.resample('D')
.ffill()
.join(df.set_index(['country','id','date']))
.reset_index(level = [0,1],drop=True))
print(df2)
country id value
date
2019-01-02 Germany 2 4.0
2019-01-01 USA 1 2.0
2019-01-02 USA 1 NaN
2019-01-03 USA 1 NaN
2019-01-04 USA 1 3.0
2019-01-05 USA 1 NaN
2019-01-06 USA 1 NaN
2019-01-07 USA 1 NaN
2019-01-08 USA 1 NaN
2019-01-09 USA 1 NaN
2019-01-10 USA 1 NaN
2019-01-11 USA 1 NaN
2019-01-12 USA 1 3.0
2019-01-03 USA 2 5.0
<小时/>
应用滚动+移位
new_df = df.join(df2.groupby(['country','id'])
.value
.rolling(5,min_periods=1)
.mean()
.groupby(level = [0,1])
.shift()
.rename('previous_5_day_average_value'),
on =['country','id','date']
)
print(new_df)
date id country value previous_5_day_average_value
0 2019-01-01 1 USA 2 NaN
1 2019-01-02 2 Germany 4 NaN
2 2019-01-03 2 USA 5 NaN
3 2019-01-04 1 USA 3 2.0
4 2019-01-12 1 USA 3 NaN
简洁的代码
new_df = df.join(df.set_index('date')
.groupby(['country','id'])['country','id']
.resample('D')
.ffill()
.join(df.set_index(['country','id','date']))
.reset_index(level = [0,1],drop=True)
.groupby(['country','id'])
.value
.rolling(5,min_periods=1)
.mean()
.groupby(level = [0,1])
.shift()
.rename('previous_5_day_average_value'),
on =['country','id','date'])
关于python - Pandas:从多个 groupby 中获取先前日期时间的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59857661/