如何按对象计算熊猫组列中的不同值?
Posted
技术标签:
【中文标题】如何按对象计算熊猫组列中的不同值?【英文标题】:How to count distinct values in a column of a pandas group by object? 【发布时间】:2013-07-29 09:00:00 【问题描述】:我有一个 pandas 数据框并将其按两列分组(例如 col1
和 col2
)。对于col1
和col2
的固定值(即对于一个组),我可以在col3
中有几个不同的值。我想计算第三列中不同值的数量。
例如,如果我有这个作为我的输入:
1 1 1
1 1 1
1 1 2
1 2 3
1 2 3
1 2 3
2 1 1
2 1 2
2 1 3
2 2 3
2 2 3
2 2 3
我想将此表(数据框)作为输出:
1 1 2
1 2 1
2 1 3
2 2 1
【问题讨论】:
相关话题为.value_counts() 【参考方案1】:df.groupby(['col1','col2'])['col3'].nunique().reset_index()
【讨论】:
有趣的是nunique
似乎是 Jeff 的回答速度的两倍。
奇怪!我也看到了。 Groupby 可能在这里采取了错误的所谓路径——将函数应用于组的逻辑非常密集。
在每个组上调用value_count
(必须重建系列)会产生更多开销(而不是只返回一个ndarray的unique
)。这实际上可能很重要。如果您不需要函数内部的索引,那么您通常可以避免这种惩罚(通过不实例化 value_counts 所做的系列,然后被丢弃,因为您只需要它的 len)
在 pandas 0.18.0 中使用 nunique() 似乎是最佳的【参考方案2】:
In [17]: df
Out[17]:
0 1 2
0 1 1 1
1 1 1 1
2 1 1 2
3 1 2 3
4 1 2 3
5 1 2 3
6 2 1 1
7 2 1 2
8 2 1 3
9 2 2 3
10 2 2 3
11 2 2 3
In [19]: df.groupby([0,1])[2].apply(lambda x: len(x.unique()))
Out[19]:
0 1
1 1 2
2 1
2 1 3
2 1
dtype: int64
【讨论】:
以上是关于如何按对象计算熊猫组列中的不同值?的主要内容,如果未能解决你的问题,请参考以下文章
用于计数和显示(列中的不同值)的 Sql 查询优化,按其他两列分组