簡體   English   中英

Pandas數據幀與多個groupby相加

[英]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.

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