如何按对象计算熊猫组列中的不同值?

Posted

技术标签:

【中文标题】如何按对象计算熊猫组列中的不同值?【英文标题】:How to count distinct values in a column of a pandas group by object? 【发布时间】:2013-07-29 09:00:00 【问题描述】:

我有一个 pandas 数据框并将其按两列分组(例如 col1col2)。对于col1col2 的固定值(即对于一个组),我可以在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 查询优化,按其他两列分组

熊猫日期列中的不同格式 - 列与行的数据类型

如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值

如果列表中的索引,熊猫按功能分组以执行不同的方法

特征缩放以相同比例转换列中的不同值