【问题标题】:Pandas groupby into unique sets and then value_counts熊猫 groupby 成唯一的集合,然后 value_counts
【发布时间】:2021-02-17 03:36:16
【问题描述】:

只是想知道是否有更好的方法来做到这一点。基本上我有一些类别,我想为每个 val 找到所有唯一的组合,然后计算每个类别的实例数。包含astype(str) 让我很恼火。

df = pd.DataFrame(
    {
        'cat': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b'],
        'val': [1, 1, 2, 2, 3, 4, 5, 5]
    }
)

df.groupby('val')['cat'].apply(lambda x: set(x)).astype(str).value_counts() 

输出:

{'a', 'b'}    2
{'c', 'a'}    1
{'b'}         1
{'c'}         1
Name: cat, dtype: int64 

以下没有给出想要的结果

df.groupby('val')['cat'].unique().value_counts()

输出:

[b]       1
[c, a]    1
[a, b]    1
[c]       1
[a, b]    1 

【问题讨论】:

  • 那么.. 代码中的问题是什么?
  • groupby 应用没有问题,我觉得我需要将 set 系列转换为 str 系列并想知道是否有更好的方法

标签: python pandas pandas-groupby


【解决方案1】:

您可以将GroupBy.agg 用于tuplefrozenset,因为它们是可散列的,然后使用Series.value_counts

df.groupby('val').agg(tuple).value_counts()
#               _.agg(frozenset).value_counts() works fine too.

cat   
(a, b)    2
(a, c)    1
(b)       1
(c)       1
dtype: int64

【讨论】:

  • 嗯我认为只有frozenset有效,请参阅df = pd.DataFrame({'cat': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'b', 'a'], 'val': [1, 1, 2, 2, 3, 4, 5, 5, 6, 6]})
  • @bbd108 如果您认为(a, b)(b, a) 与frozenset 类似,否则使用tuple它维护插入顺序。 frozenset 也会删除重复项。
  • 接受frozenset,感谢指出其可散列
猜你喜欢
  • 2019-01-18
  • 2021-11-10
  • 2021-07-16
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2020-08-09
相关资源
最近更新 更多