【问题标题】:Count occurrences in a list for each row and specific column in a dataframe计算数据框中每一行和特定列在列表中的出现次数
【发布时间】:2020-03-18 15:45:44
【问题描述】:

我一直在尝试在 Python 3.7 中使用 collection.Countervalue_counts 来执行类似下面的 df 的操作,但没有成功。到目前为止,这是我想要得到的一个例子:

    IDs        Col2               Col3
0   123   [A, A, B, B, C]    {A:2, B:2, C:1}
1   456   [A, B, C, C]       {A:1, B:1, C:2}
2   789   [A, A, A, D, D]    {A:3, D:2}

然后我需要为每个对应行获取Col3 中的最大值,如果存在平局,则仅在新列中显示它并使用已关联的键。像这样的:

    IDs        Col2               Col3            Max
0   123   [A, A, B, B, C]    {A:2, B:2, C:1}   {A:2, B:2}
1   456   [A, B, C, C]       {A:1, B:1, C:2}   {C:2}
2   789   [A, A, A, D, D]    {A:3, D:2}        {A:3}

【问题讨论】:

  • 你能做 df.to_dict() 并以可复制的形式分享数据框吗?
  • 欢迎@niq13。为了改善您的问题并获得准确的答案您可以向我们展示如何构建数据框。 df = pd.DataFrame({'IDs':[123, 456, 789], 'Col12':[a, .]}) .... 但是。您可以使用 pandas DataFrame 的 groupby 功能。 df.groupby('IDs').count(), or df.groupby('IDs').max() 然后选择右列

标签: python python-3.x pandas dictionary counter


【解决方案1】:

如果值为max,则使用带有测试的dict理解:

from collections import Counter

df = pd.DataFrame({'Col1':[123,456,789], 
                   'Col2':[list('AABBC'), list('ABCC'), list('AAADD')]})

df['Col3'] = df['Col2'].apply(Counter)
df['Max'] = df['Col3'].apply(lambda x: {k:v for k, v in x.items() if max(x.values()) == v})

感谢@Keyur Potdar 的另一个想法使用most_common

f = lambda x: {k:v for k, v in x.items() if x.most_common(1)[0][1] == v}
df['Max'] = df['Col3'].apply(f)

print (df)
   Col1             Col2                      Col3               Max
0   123  [A, A, B, B, C]  {'A': 2, 'B': 2, 'C': 1}  {'A': 2, 'B': 2}
1   456     [A, B, C, C]  {'A': 1, 'B': 1, 'C': 2}          {'C': 2}
2   789  [A, A, A, D, D]          {'A': 3, 'D': 2}          {'A': 3}

【讨论】:

  • 由于Col3中的项目是collections.Counter的对象,用x.most_common(1)[0][1] == v代替max(x.values()) == v不是更好吗?
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 2021-10-15
  • 2022-01-04
  • 2021-11-09
  • 2023-03-17
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多