[英]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 列column1
和column2
上按group
和index
列分組的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.