【问题标题】:counting all string values in given column of a table and grouping it based on third column计算表的给定列中的所有字符串值并根据第三列对其进行分组
【发布时间】:2019-03-21 10:24:57
【问题描述】:

我有三列。表格如下所示:

ID.   names     tag
1.     john.     1
2.     sam       0
3.    sam,robin. 1
4.     robin.    1

Id:整数类型 名称:类型字符串 标签:类型整数(仅 0,1)

我想要的是找到每个名称重复多少次,按 0 和 1 分组。这是在 python 中完成的。

答案必须看起来像

               0                 1
John           23                12
Robin          32                10
sam            9                 30

【问题讨论】:

  • 这些名称是在列表中用逗号分隔的['sam', 'robin.'] 还是字符串'sam,robin.'?
  • 我无法理解预期的输出。约翰 23 岁是多少? 12 是多少?
  • 这只是一个示例,假设对于给定的完整输入(不是 4 行),john 碰巧在 tag=1 时弹出 23 次,在 tag=0 时弹出 12 次​​span>
  • 那么您需要提供一个代表您的数据的minimal reproducible example。否则,您将获得针对您发布的问题的解决方案,而不是您遇到的问题。如果值之间有分号,那么您的示例中应该有分号。
  • @ALollz 很抱歉让您感到困惑。我已经编辑了我的问题。

标签: python pandas dataframe multiple-columns querying


【解决方案1】:

使用extractall 和crosstab:

s = df.names.str.extractall(r'(\w+)').reset_index(1, drop=True).join(df.tag)

pd.crosstab(s[0], s['tag'])

tag    0  1
0
john   0  1
robin  0  2
sam    1  1

【讨论】:

  • 是的,这行得通。我打错了。太感谢了。这是一个非常简洁的答案。
  • 这会分隔所有内容,包括由斜线和空格分隔的内容。我们能否将分隔实体限制为仅分号 (;)?
  • 不清楚您如何知道如何将John A/John Adams 与John A 分组。这使得这成为一个非常更复杂的问题。我回滚了你的问题,因为你不应该在你已经得到答案后编辑它,但你应该根据你的新要求提出一个新问题。
  • 你可以使用类似s = df.names.str.extractall(r'([^;.]+)')[0].str.strip().reset_index(1, drop=True).to_frame().join(df.tag)的东西创建s
  • 谢谢。这解决了我的大部分问题。我可以在那里做。非常感谢。
【解决方案2】:

由于您的 names 列的性质,需要进行一些重新处理才能获得值计数。对于您的示例数据框,这可能类似于:

my_counts = (df.set_index(['ID.', 'tag'])
             # Get rid of periods and split on commas
             .names.str.strip('.').str.split(',')
             .apply(pd.Series)
             .stack()
             .reset_index([0, 1])
             # rename column 0 for consistency, easier reading
             .rename(columns={0: 'names'})
             # Get value counts of names per tag:
             .groupby('tag')['names']
             .value_counts()
             .unstack('tag', fill_value=0))

>>> my_counts
tag    0  1
names      
john   0  1
robin  0  2
sam    1  1

【讨论】:

  • 熊猫数据框没有名称属性。所以我无法验证您的解决方案
  • 还有一些名字就像 John A/John adams ;山姆·约翰; robin john 因此,如果我们删除所有内容,它不会给我错误的答案
  • 对于您的第一条评论,df.columns 的输出是什么?因为您的数据框显然有一个 names 列。其次,您必须提供一个实际代表您的案例的示例。上面的代码提供了我为您提供的数据框发布的解决方案。我们无法推断您在 names 列中的不同类型的结构。
  • 哦对不起我的错。我的数据框包含“名称”作为列名,但是当我们编写 df.names 时,它显示名称不是数据框的属性。此外,当我编写 df.columns 时,它会显示列名列表,即 ['id', 'names','tag']
  • 我收到一个错误:“'DataFrameGroupBy' 对象没有属性 'value_counts'”
猜你喜欢
  • 1970-01-01
  • 2017-10-19
  • 2021-01-16
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多