簡體   English   中英

Pandas Groupby 日期時間列上多列的滾動總和

[英]Pandas Groupby rolling sum of multiple columns on datetime column

我正在嘗試按組獲取多列的滾動總和,在日期時間列上滾動(即在指定的時間間隔內)。 滾動一列似乎工作正常,但是當我通過矢量化滾動多列時,我得到了意想不到的結果。

我的第一次嘗試:

df = pd.DataFrame({"column1": range(6), 
                   "column2": range(6), 
                   'group': 3*['A','B'], 
                   'date':pd.date_range("20190101", periods=6)})

(df.groupby('group').rolling("1d", on='date')['column1'].sum()).groupby('group').shift(fill_value=0)

# output:
group  date      
A      2019-01-01    0.0
       2019-01-03    0.0
       2019-01-05    2.0
B      2019-01-02    0.0
       2019-01-04    1.0
       2019-01-06    3.0
Name: column1, dtype: float64

以上產生了預期的結果,但是我在此過程中丟失了原始索引。 由於在我的數據中某些日期是相同的,因此我必須在 group+date 上重新加入原始 dataframe,這是低效的。 因此,我應用了以下方法來避免這種情況並保留原始索引:

df.groupby('group').apply(lambda x: x.rolling("1d", on='date')['column1'].sum().shift(fill_value=0))

# output:
group   
A      0    0.0
       2    0.0
       4    2.0
B      1    0.0
       3    1.0
       5    3.0
Name: column1, dtype: float64

有了這個,我可以通過對索引進行排序輕松地將它分配給原始 df 的新列。 現在我想對“column2”重復相同的操作,並通過矢量化來做到這一點。 但是,我得到的結果是出乎意料的:

df.groupby('group').apply(lambda x: x.rolling("1d", on='date')[['column1','column2']].sum().shift(fill_value=0))

# output:

   column1  column2       date
0      0.0      0.0 1970-01-01
1      0.0      0.0 1970-01-01
2      0.0      0.0 2019-01-01
3      1.0      1.0 2019-01-02
4      2.0      2.0 2019-01-03
5      3.0      3.0 2019-01-04

結果是正確的,但出於以下原因出乎意料:(1)groupby 中的 group_keys 被忽略(2)它自動對結果進行排序並重置索引,就像在“轉換”方法中一樣。

我想了解為什么會發生這種情況,還有其他方法可以實現上述結果。

我采用了你原來的方法並做了一些改變。 你能檢查這是否是你想要的嗎?

重置原始數據框的索引,並為原始索引分配列名。

df = df.reset_index().rename(columns={df.index.name: 'index'})

現在,您擁有相同的原始數據框,但它有一個名為index的附加列,它是原始索引。

在 2 列column1column2上按groupindex列分組的groupby數據幀上應用rolling

(df.groupby(['group', 'index']).rolling("1d", on='date')[['column1', 'column2']].sum()).groupby('group').shift(fill_value=0)

結果:

                        column1  column2
group index date                        
A     0     2019-01-01      0.0      0.0
      2     2019-01-03      0.0      0.0
      4     2019-01-05      2.0      2.0
B     1     2019-01-02      0.0      0.0
      3     2019-01-04      1.0      1.0
      5     2019-01-06      3.0      3.0

如果您想要原始索引,請重置多索引並將“索引”設置為索引

(df.groupby(['group', 'index']).rolling("1d", on='date')[['column1', 'column2']].sum()).groupby('group').shift(fill_value=0).reset_index().set_index('index')

結果:

      group       date  column1  column2
index                                   
0         A 2019-01-01      0.0      0.0
2         A 2019-01-03      0.0      0.0
4         A 2019-01-05      2.0      2.0
1         B 2019-01-02      0.0      0.0
3         B 2019-01-04      1.0      1.0
5         B 2019-01-06      3.0      3.0

如果要對其進行排序,請添加.sort_index()

      group       date  column1  column2
index                                   
0         A 2019-01-01      0.0      0.0
1         B 2019-01-02      0.0      0.0
2         A 2019-01-03      0.0      0.0
3         B 2019-01-04      1.0      1.0
4         A 2019-01-05      2.0      2.0
5         B 2019-01-06      3.0      3.0

希望這可以幫助。 如果我遺漏了什么,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM