首页 > 解决方案 > 使用 groupby 创建一个缺少日期的单调列表

问题描述

我正在寻找一段时间内所有县的滚动平均值。但是,第一个县“A”县缺少 1 月 3 日的时间点。

def crt_data():
    data = [[datetime(2020, 1, 1), 'A', 1],
         [datetime(2020,1,2), 'A', 2],
         #[datetime(2020,1,3), 'A', 3],
         [datetime(2020,1,4), 'A', 4],
         [datetime(2020,1,1), 'B', 10],
         [datetime(2020,1,2), 'B', 11],
         [datetime(2020,1,3), 'B', 12],
         [datetime(2020,1,4), 'B', 13],
         [datetime(2020,1,1), 'C', 4],
         [datetime(2020,1,2), 'C', 3],
         [datetime(2020,1,3), 'C', 2],
         [datetime(2020,1,4), 'C', 1]
           ]
    df = pd.DataFrame(data, columns=['my_date', 'County', 'cmi'])
    return df

df = crt_data()

print('\n \n roll over  by timepoint')
df['my_mean'] = df.groupby('my_date')['cmi'].mean().reset_index(0, drop=True)
df = df.sort_values(by=['County', 'my_date'])
df['rolling_cmi2'] = df.my_mean.rolling(2).mean()
print(df)

      my_date County  cmi   my_mean  rolling_cmi2
0  2020-01-01      A    1  5.000000           NaN
1  2020-01-02      A    2  5.333333      5.166667
2  2020-01-04      A    4  7.000000      6.166667
3  2020-01-01      B   10  6.000000      6.500000
4  2020-01-02      B   11       NaN           NaN
5  2020-01-03      B   12       NaN           NaN
6  2020-01-04      B   13       NaN           NaN
7  2020-01-01      C    4       NaN           NaN
8  2020-01-02      C    3       NaN           NaN
9  2020-01-03      C    2       NaN           NaN
10 2020-01-04      C    1       NaN           NaN

编辑:我希望看到的是这样的:

     my_date County  cmi   my_mean  rolling_cmi2
0  2020-01-01      A    1  5.000000           NaN
1  2020-01-02      A    2  5.333333      5.166667
3  2020-01-03      B   12  7.000000      6.166667
2  2020-01-04      A    4  7.000000      7.000000

当我分组时,我没有得到 1 月 3 日的日期和 1 月 1 日的两个日期。这使得滚动值不正确。

如何使用每个日期之一将其减少到单个平均值,并且该日期是正确的日期?我知道 C 县有所有正确的时间点,我可以将 C 县移到列表顶部以获得完整的日期列表吗?你会怎么做?

标签: pandasgroup-bypandas-groupbyrolling-computation

解决方案


推荐阅读