【问题标题】:Pandas: How to groupby and get a count of uniques in a given column?Pandas:如何分组并获取给定列中的唯一性计数?
【发布时间】:2016-01-14 18:19:40
【问题描述】:
我有一个包含三列的 DataFrame:
id order ordernumber
1 app 1
1 pip 2
1 org 3
2 app 1
3 app 1
3 org 3
“订单”列只有 3 个唯一值(app、pip 和 org)。我想得到一个 DataFrame,它显示每个 id 有多少订单,以及他们的总订单数。
结果如下所示:
id app pip org total
1 1 1 1 3
2 1 0 0 1
3 1 0 1 2
【问题讨论】:
标签:
python
pandas
dataframe
pivot-table
【解决方案1】:
您可以使用pivot_table 获取计数:
>>> df2 = df.pivot_table(index='id', columns='order', aggfunc='size', fill_value=0)
>>> df2
order app org pip
id
1 1 1 1
2 1 0 0
3 1 1 0
然后您可以通过对每一行求和来添加“总计”列:
>>> df2['total'] = df2.sum(axis=1)
>>> df2
order app org pip total
id
1 1 1 1 3
2 1 0 0 1
3 1 1 0 2
【解决方案2】:
ajcr 的替代品:
df2 = df.pivot_table(index='id', columns='order', aggfunc=lambda x: len(x.unique()), margins=True)
使用不同的aggfunc 来计算唯一性。
In [4]: df2 = df.pivot_table(index='id', columns='order', aggfunc=lambda x: len(x.unique()), margins=True)
In [5]: df2
Out[5]:
ordernum
order app org pip All
id
1 1 1 1 3
2 1 NaN NaN 1
3 1 1 NaN 2
All 1 1 1 3
您还可以使用margins 参数自动获取pivot_table 函数的列/行小计。
如果您之后需要替换NaN,您可以使用:
df2.fillna(0, inplace=True)
In [6]: df2.fillna(0, inplace=True)
In [7]: df2
Out[7]:
ordernum
order app org pip All
id
1 1 1 1 3
2 1 0 0 1
3 1 1 0 2
All 1 1 1 3