簡體   English   中英

大多數pythonic方法基於索引組對數據幀中的行求和

[英]Most pythonic way to sum rows in a dataframe based on index groups

我有以下pandas數據幀:

df = pd.DataFrame([[1,2,3,'a'],[4,5,6,'a'],[2,4,1,'a'],[2,4,1,'b'],[4,9,6,'b'],[2,4,1,'b']], index=[0,1,2,0,1,2], columns=['aa','bb','cc','cat'])


     aa    bb    cc    cat
0    1      2     3    a
1    4      5     6    a
2    2      4     1    a
0    2      4     1    b
1    4      9     6    b
2    2      4     1    b

我需要添加具有相同索引的行。

    aa   bb   cc  cat
0   3    6    4    ab
1   8   14   12    ab
2   4    8    2    ab

我使用了以下代碼:

df_ab = df[df['cat'] == 'a'] + df[df['cat'] == 'b']

但這是最蟒蛇的方式嗎?

使用groupbyagg

df.groupby(df.index).agg({'aa': 'sum',
                          'bb': 'sum',
                          'cc': 'sum',
                          'cat': ''.join})

或傳遞numeric_only=False (更簡單,但我不建議)

df.groupby(df.index).sum(numeric_only=False)

兩個輸出

    aa  bb  cc cat
0   3   6   4  ab
1   8  14  12  ab
2   4   8   2  ab

我們可以選擇列的dtype並確定要使用哪種類型的agg函數

df.groupby(level=0).agg(lambda x : x.sum() if x.dtype!='object' else ''.join(x))
Out[271]: 
   aa  bb  cc cat
0   3   6   4  ab
1   8  14  12  ab
2   4   8   2  ab

使用這個單線:)

(df.reset_index().groupby("index")
 .agg(lambda x:np.sum(x) if x.dtype == "int" else "".join(x)) 

暫無
暫無

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

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