[英]Groupby pandas dataframe two columns with same value
我想對“A”和“B”中具有相同值的兩列進行cumsum
groupby
值分組 dataframe 的示例
A B ValueA ValueB
0 b a 1 3
1 c a 2 2
2 a b 2 4
現在,如果該值在“A”列中,則考慮將 ValueA 設置為cumsum
如果該值在“B”列中,則考慮將 ValueB 設置為cumsum
編輯:我會像cumsum
一樣執行shift().rolling()
,我試着把它放在 groupby 之后,但結果不正確。
代碼
from numpy.core.numeric import NaN
df = pd.DataFrame({
'A' : ['b','c','a','c','a','c','b','c'],
'B': ['a', 'a', 'b', 'b','c','a','a','b'],
'ValueA':[1,2,2,1,2,4,7,1],
'ValueB':[3,2,4,3,1,2,4,5]
})
print(df)
df[['sumA','sumB']] = (
df[['ValueA','ValueB']].stack(dropna=False)
.groupby(df[['A','B']].stack().tolist())
.cumsum()
.unstack()
)
print(df)
#groupby(...).shift().rolling(2, min_periods=2).sum()
df['Expected_Shift_RollingA'] = [NaN,NaN,5,NaN,4,2,7,5]
df['Expected_Shift_RollingB'] = [NaN,NaN,NaN,5,3,4,4,10]
print(df)
您可以stack
值列,在堆疊的 AB 列上使用groupby
,然后cumsum
和unstack
返回原始形狀
df[['sumA','sumB']] = (
df[['ValueA','ValueB']].stack()
.groupby(df[['A','B']].stack().tolist())
.cumsum()
.unstack()
)
print(df)
A B ValueA ValueB sumA sumB
0 b a 1 3 1 3
1 c a 2 2 2 5
2 a b 2 4 7 5
3 c b 1 3 3 8
編輯:查看原始數據后,缺少一些值,因此需要調整上述方法。
通過用 0 填充缺失值。
df[['ValueA','ValueB']].fillna(0).stack()
.groupby(...
或者在stack
時保持nan
。
df[['ValueA','ValueB']].stack(dropna=False)
.groupby(...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.