【问题标题】:Python dataframes: how can I return the number of occurrences in a column?Python数据框:如何返回列中出现的次数?
【发布时间】:2020-03-03 14:34:28
【问题描述】:

我正在处理一个大型 csv 文件,其中的信息类似于

id      year   decade  code  type
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
3366    2014    2010    EM  Chemical
427     1972    1970    DR  Coastal Storm
337     1972    1970    DR  Coastal Storm
337     1972    1970    DR  Coastal Storm

我想按“id”列中唯一出现的次数进行排序。我想要的结果看起来像

id      year   decade  code  type          count
3366    2014    2010    EM  Chemical        5
427     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   2

但是我试图满足于类似的东西

id      year   decade  code  type           count
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
3366    2014    2010    EM  Chemical        5
427     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   1
337     1972    1970    DR  Coastal Storm   2

我试图通过尝试来做到这一点

df['count']=df.groupby('id').transform('count')

但我不断收到错误

ValueError: Wrong number of items passed 18, placement implies 1

有没有更好的方法来实现这一点?

【问题讨论】:

  • df["count"] = df.groupby("id")["type"].transform("count")?

标签: python pandas dataframe data-science


【解决方案1】:

对于第一个想要的解决方案:

data = data.groupby(['id',  'year', 'decade',   'code', 'type']).id.count()
data
id    year  decade  code  type         
337   1972  1970    DR    Coastal Storm    2
427   1972  1970    DR    Coastal Storm    1
3366  2014  2010    EM    Chemical         5
Name: id, dtype: int64

第二个:

data['count'] = data.groupby(['id', 'year', 'decade',   'code', 'type']).id.transform('count')
data
id  year    decade  code    type    count
0   3366    2014    2010    EM  Chemical    5
1   3366    2014    2010    EM  Chemical    5
2   3366    2014    2010    EM  Chemical    5
3   3366    2014    2010    EM  Chemical    5
4   3366    2014    2010    EM  Chemical    5
5   427 1972    1970    DR  Coastal Storm   1
6   337 1972    1970    DR  Coastal Storm   2
7   337 1972    1970    DR  Coastal Storm   2

数据:

id;year;decade;code;type
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
3366;2014;2010;EM;Chemical
427;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm
337;1972;1970;DR;Coastal Storm

import pandas as pd
data = pd.read_clipboard(sep=';')

【讨论】:

  • 好的,我看到了。您只需要将其重新分配回自身。请看我的编辑
  • 是的,它解决了一部分。我现在对此处提供的两种解决方案都有同样的问题。两者都非常适合我给出的示例。但是,当将它应用到我的实际数据集时,它似乎也不能正常工作。在我的原始数据框中,我从大约 51,000 行开始。一旦我运行 groupby 语句,它就会减少到大约 39,000。但是“count”列总是返回 1。我还可以看到“id”列中有重复。我只是想弄清楚我错过了什么。
【解决方案2】:
df.groupby(list(df.columns)).size().reset_index().rename(columns={0:'count'})
  • .size() 会让你计数,但会创建一个多级索引
  • .reset_index() 将摆脱多级索引,其计数包含在名为 0 的列中
  • .rename(columns = {0:'count'}) 会将此列重命名为 count

您可以使用转换,但请确保您传递的序列长度与您的数据框相同。您可以通过将 ['year'] 添加到您的 groupby 来做到这一点,但您的任何列都可以:

df['counts'] = df.groupby('id')['year'].transform('count')

【讨论】:

  • 谢谢!我也很欣赏你的解释。
  • 您能否准确解释一下您的解决方案指定按“id”分组的位置?这些解决方案非常适合我给出的简单示例。但是,当将它应用于我正在使用的实际数据框时,“计数”列中的每一行都返回 1。我认为它也应该适用于我的实际数据集。唯一的区别是行和列更多,但分组和一切都应该保持不变。
  • 在堆栈溢出问题示例的情况下按['id', 'year', 'decade', 'code', 'type'] 分组会产生重复记录,这就是 groupby 产生大于一的计数的原因。换句话说,如果 groupby 括号中包含的列组合产生唯一记录,则 size().transform('count') 将是一个。
  • 我可以只按id分组吗?根据您的解释,我认为它不适用于我的实际数据框的原因是因为我不关心的其他列之间存在一些差异。也许一个解决方案是删除我认为不必要的列,因为我只关心 19 列中的一半。
  • 我删除了所有不相关的列,得到了我想要的结果,谢谢你的帮助!
猜你喜欢
  • 2015-09-09
  • 2018-12-07
  • 1970-01-01
  • 2022-01-11
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多