[英]Pandas dataframe summing with multiple groupby
我有以下數據幀:
df2 = pd.DataFrame({'season':[1,1,1,2,2,2,3,3],'value' : [-2, 3,1,5,8,6,7,5], 'avail':[3,3,3,8,8,4,25,25],'test2':[4,5,7,8,9,10,11,12]},index=['2020', '2020', '2020','2020', '2020', '2021', '2021', '2021'])
df2.index= pd.to_datetime(df2.index)
df2.index = df2.index.year
print(df2)
avail season test2 value
2020 3 1 4 -2
2020 3 1 5 3
2020 3 1 7 1
2020 8 2 8 5
2020 8 2 9 8
2021 4 2 10 6
2021 25 3 11 7
2021 25 3 12 5
我想有效地計算每年“有用”列的總和。 這里的難點在於每個賽季只有一個“可用”價值。 例如,對於2020年,我想要總和3 + 8 = 11。
預期結果(列'sum_avail'):
avail season test2 value sum_avail
2020 3 1 4 -2 11
2020 3 1 5 3 11
2020 3 1 7 1 11
2020 8 2 8 5 11
2020 8 2 9 8 11
2021 4 2 10 6 29
2021 25 3 11 7 29
2021 25 3 12 5 29
IIUC, transform
+ set
df2.groupby(level=0).avail.transform(lambda x : sum(set(x)))
Out[220]:
2020 11
2020 11
2020 11
2020 11
2020 11
2021 29
2021 29
2021 29
Name: avail, dtype: int64
你需要groupby
+ transform
+ np.unique
:
df2['sum_avail'] = (
df2.groupby(level=0).avail.transform(lambda x: np.unique(x).sum()))
要么,
df2['sum_avail'] = df2.groupby(level=0).avail.transform('unique').apply(sum)
df2
avail season test2 value sum_avail
2020 3 1 4 -2 11
2020 3 1 5 3 11
2020 3 1 7 1 11
2020 8 2 8 5 11
2020 8 2 9 8 11
2021 4 2 10 6 29
2021 25 3 11 7 29
2021 25 3 12 5 29
這是一種方法,它采用每個指數/季節對中的第一個值,然后將它們相加:
res = df2.groupby([df2.index, 'season'])['avail'].first().sum(level=0)
df2.join(res.rename('sum_avail'))
season value avail test2 sum_avail
2020 1 -2 3 4 11
2020 1 3 3 5 11
2020 1 1 3 7 11
2020 2 5 8 8 11
2020 2 8 8 9 11
2021 2 6 4 10 29
2021 3 7 25 11 29
2021 3 5 25 12 29
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.