使用Python使用groupby获取数据框中所选列的唯一计数

时间:2015-09-23 23:29:29

标签: python aggregation

我的数据框如下:

import pandas as pd

df=pd.DataFrame({'A':['a','a','b','c'], 'B':['x','x','x','x'],'C':['1','2','3','4'], 'D':[0,0,0,0]})
gb_a=df.groupby(['A'], as_index=False)

我想要的输出:

A    unique_b    unique_c
a       1          2
b       1          1
c       1          1

我尝试了以下内容:

gb_a['B','C'].agg({'B':pd.Series.nunique, 'C':pd.Series.nunique})
gb_a['B','C'].agg({'unique_b':pd.Series.nunique, 'unique_c':pd.Series.nunique})
gb_a['B','C'].agg({'B': {'unique_b':pd.Series.nunique}, 'C': {'unique_c':pd.Series.nunique}})

我收到错误:

KeyError: ('B', 'C')

问题

是否可以在上述技术中修复它?

我知道我可以单独进行,然后合并如下:

out_df=gb_a['B'].agg({'unique_b':pd.Series.nunique})
out_df= pd.merge(out_df,gb_a['C'].agg({'unique_c':pd.Series.nunique}), on='A', how='inner')

但我应该对选定的列(很多列)进行不同的聚合。不想在大数据上多次合并。

我正在使用Python 2.7

感谢。

P.S。我已经阅读过类似主题的不同答案。例如

Naming returned columns in Pandas aggregate function?

1 个答案:

答案 0 :(得分:0)

the docs, SeriesGroupBy对象具有nunique方法。因此,您可以使用

汇总gb_a
gb_a.agg({'B': 'nunique', 'C': 'nunique'})
import pandas as pd

df = pd.DataFrame({'A': ['a', 'a', 'b', 'c'], 'B': ['x', 'x', 'x', 'x'], 'C': [
                  '1', '2', '3', '4'], 'D': [0, 0, 0, 0]})
gb_a = df.groupby(['A'], as_index=False)
result = gb_a.agg({'B': 'nunique', 'C': 'nunique'})
result = result.rename(columns={'B':'unique_b', 'C':'unique_c'})
print(result)

打印

   A  unique_c  unique_b
0  a         2         1
1  b         1         1
2  c         1         1