【问题标题】:How can I retain the Date index after a groupby / rolling operation on a Multiindexed Dataframe?如何在多索引数据帧上进行分组/滚动操作后保留日期索引?
【发布时间】:2021-11-04 12:09:18
【问题描述】:

创建以下示例 DataFrame:

import pandas as pd
df = pd.DataFrame(data=[[1, 1, 10, 20], [1, 2, 30, 40], [1, 3, 50, 60],
                        [2, 1, 11, 21], [2, 2, 31, 41], [2, 3, 51, 61]],
                  columns=['id', 'date', 'd1', 'd2'])
df.set_index(['id', 'date'], inplace=True)

DataFrame 如下所示:

>>> df
         d1  d2
id date
1  1     10  20
   2     30  40
   3     50  60
2  1     11  21
   2     31  41
   3     51  61

现在,我想在移动窗口的 d1 列上应用一个函数(示例中为 sum),并且我关心将 id 和日期保留为最后的索引。

我会这样做:

df = df.groupby(level='id').rolling(window=2)['d1'].sum()

我获得的输出格式如下(在 Pandas 1.1.5 中):

>>> df

id
1      NaN
1     40.0
1     80.0
2      NaN
2     42.0
2     82.0
Name: d1, dtype: float64

我在网上看过其他示例,其中的输出实际上是我想要的:

>>> df

id      date
1          1      NaN
1          2     40.0
1          3     80.0
2          1      NaN
2          2     42.0
2          3     82.0
Name: d1, dtype: float64

我如何获得这个输出?我做错了什么?

【问题讨论】:

    标签: python pandas pandas-groupby multi-index rolling-computation


    【解决方案1】:

    直接由直接创建改为赋值即可

    out = df.set_index(['id', 'date'])['d1']
    out[:] = df.groupby('id').rolling(window=2)['d1'].sum().values
    out
    Out[180]: 
    id  date
    1   1        NaN
        2       40.0
        3       80.0
    2   1        NaN
        2       42.0
        3       82.0
    Name: d1, dtype: float64
    

    【讨论】:

    • 嗯,它有效!我想知道......这是应该如何完成的?就像,它看起来并不那么直观。非常感谢您的快速解决方案!
    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 2020-02-12
    • 2021-08-26
    • 2021-09-29
    • 1970-01-01
    • 2019-08-12
    • 2019-10-17
    • 2021-01-07
    相关资源
    最近更新 更多