簡體   English   中英

pandas group by,在輸入列上使用多個agg函數聚合

[英]pandas group by, aggregate using multiple agg functions on input columns

我想在一個pandas groupby數據幀上做一些聚合,我需要在多個列上應用幾個不同的自定義函數。 這個操作在R中非常容易和習慣(使用data.tabledplyr ),但我很驚訝我在熊貓中發現它很難:

import pandas as pd
data = pd.DataFrame({'A':[1,2,3,4,5,6],'B':[2,4,6,8,10,12],'C':[1,1,1,2,2,2]})

#These work
data.groupby('C').apply(lambda x: x.A.mean() - x.B.mean())
data.groupby('C').agg(['mean','std'])

#but this doesn't
data.groupby('C').agg([lambda x: x.A.mean() - x.B.mean(),
                       lambda x: len(x.A)])

我想計算一個統計量,但也計算每個組中的樣本大小,這似乎應該是一個或兩個行解決方案,但我有時也需要在分組數據框的多個列上應用多個函數。

我們可以編寫一個函數,在多個列上執行自定義函數,並將結果作為數據框返回。

>>> def meandiff_length(data):
            data['mean_diff'] = data.A.mean() - data.B.mean()
            data['a_length'] = len(data.A)
            return data

我們可以對數據進行分組,並將自定義函數分別應用於組。

>>> data.groupby('C').apply(meandiff_length)
   A   B  C  mean_diff  a_length
0  1   2  1       -2.0         3
1  2   4  1       -2.0         3
2  3   6  1       -2.0         3
3  4   8  2       -5.0         3
4  5  10  2       -5.0         3
5  6  12  2       -5.0         3

此特定自定義函數在每一行中返回相同的值,因此使用drop_duplicates可能是您感興趣的。 但是,這是一個通用的解決方案,當我們的自定義功能變得更復雜時也可以使用。

如果您需要單行,您可以這樣做:

#use apply instead of agg to create multiple columns
data.groupby('C').apply(lambda x: pd.Series([x.A.mean() - x.B.mean(), len(x.A)])).rename(columns={0:'diff',1:'a_len'})
Out[2346]: 
   diff  a_len
C             
1  -2.0    3.0
2  -5.0    3.0

不使用重命名的另一種解決方案

data.groupby('C').apply(lambda x: pd.DataFrame([[x.A.mean() - x.B.mean(), len(x.A)]],columns=['diff','a_len']))
Out[24]: 
     diff  a_len
C               
1 0  -2.0      3
2 0  -5.0      3

暫無
暫無

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

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