簡體   English   中英

由另一列 pandas 分組的列中的總和值

[英]sum values in column grouped by another column pandas

我的 df 看起來像這樣:

country   id       x       y
AT        11      50     100
AT        12      NaN     90
AT        13      NaN    104
AT        22      40      50
AT        23      30      23
AT        61      40      88
AT        62      NaN     78  
UK        11      40      34
UK        12      NaN     22
UK        13      NaN     70

我需要的是第一行中 y 列的總和,它不是 x 中的 NaN,按列 id 左側的第一個數字分組。 這對每個國家都是分開的。 最后,我只需要刪除 NaN。

結果應該是這樣的:

country   id       x       y
AT        11      50     294
AT        22      40      50
AT        23      30      23
AT        61      40     166
UK        11      40      126

您可以通過GroupBy.agg by firstsum函數與 helper Series通過比較 Series.notna 的非缺失值和Series.notna的累積總和來Series.cumsum

df1 = (df.groupby(['country', df['x'].notna().cumsum()])
         .agg({'id':'first', 'x':'first', 'y':'sum'})
         .reset_index(level=1, drop=True)
         .reset_index())
print (df1)
  country  id     x    y
0      AT  11  50.0  294
1      AT  22  40.0   50
2      AT  23  30.0   23
3      AT  61  40.0  166
4      UK  11  40.0  126

如果可能x的第一個值是錯誤值,請添加DataFrame.dropna

print (df)
   country  id     x    y
0       AT  11   NaN  100
1       AT  11  50.0  100
2       AT  12   NaN   90
3       AT  13   NaN  104
4       AT  22  40.0   50
5       AT  23  30.0   23
6       AT  61  40.0   88
7       AT  62   NaN   78
8       UK  11  40.0   34
9       UK  12   NaN   22
10      UK  13   NaN   70

df1 = (df.groupby(['country', df['x'].notna().cumsum()])
         .agg({'id':'first', 'x':'first', 'y':'sum'})
         .reset_index(level=1, drop=True)
         .reset_index()
         .dropna(subset=['x']))
print (df1)
  country  id     x    y
1      AT  11  50.0  294
2      AT  22  40.0   50
3      AT  23  30.0   23
4      AT  61  40.0  166
5      UK  11  40.0  126

使用groupbytransformdropna

print (df.assign(y=df.groupby(df["x"].notnull().cumsum())["y"].transform('sum'))
         .dropna(subset=["x"]))

  country  id     x    y
0      AT  11  50.0  294
3      AT  22  40.0   50
4      AT  23  30.0   23
5      AT  61  40.0  166
7      UK  11  40.0  126

暫無
暫無

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

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