python - Pandas:从多个 groupby 中获取先前日期时间的平均值

标签 python pandas

如果满足 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/

相关文章:

python - <type 'exceptions.ImportError' > 当导入 pandas 和 sklearn 时

python - 如何将 Python 字典转换为 html 表?

python - Pandas 分层索引唯一值

Python 安装编译错误

python - 具有自定义 API View 的 Django 休息框架分页

python - PyQ:如何枚举展开表上的符号列?

python - Python用渐变绘制一条线,其中一种颜色是透明的

python - 请帮助 : pylint does not work with Emacs23

Python Pandas - 计算总均值,按字段分组,然后计算分组均值并追加

python - 使用多个条件操作 pandas.DataFrame