【问题标题】:How to get frequency of each element in column (having array of strings) of data frame with pandas?如何使用熊猫获取数据框列(具有字符串数组)中每个元素的频率?
【发布时间】:2020-01-28 17:56:14
【问题描述】:

我在 python 中有一个熊猫数据框,如下所示:

df['column'] = [abc, mno]
               [mno, pqr]
               [abc, mno]
               [mno, pqr]

我想得到下面每个项目的计数:

abc = 2, 
mno= 4 ,
pqr = 2

我可以对每一行进行迭代以计数,但这不是我正在寻找的解决方案。 如果有什么方法可以使用 iloc 或与之相关的任何东西,请向我提出建议。

我查看了具有类似问题的各种解决方案,但没有一个满足我的方案。

【问题讨论】:

标签: python pandas machine-learning


【解决方案1】:

这是我使用.explode().value_counts() 解决它的方法,您还可以将其分配为列或随心所欲地使用输出: 一行:

print(df.explode('column')['column'].value_counts())

完整示例:

import pandas as pd
data_1 = {'index':[0,1,2,3],'column':[['abc','mno'],['mno','pqr'],['abc','mno'],['mno','pqr']]}
df = pd.DataFrame(data_1)
df = df.set_index('index')
print(df)
           column
index            
0      [abc, mno]
1      [mno, pqr]
2      [abc, mno]
3      [mno, pqr]

这里我们执行.explode() 来从列表中创建单个值,并执行 value_counts() 来计算唯一值的重复次数:

df_new = df.explode('column')
print(df_new['column'].value_counts())

输出:

mno    4
abc    2
pqr    2

【讨论】:

  • 也可以直接爆一个系列,例如df["column"].explode().value_counts().
  • 是的,我感觉 OP 正在处理更多列(特别是因为 ML 标签)
【解决方案2】:

使用collections.Counter

from collections import Counter
from itertools import chain

Counter(chain.from_iterable(df.column))

Out[196]: Counter({'abc': 2, 'mno': 4, 'pqr': 2})

%timeit

df1 = pd.concat([df]*10000, ignore_index=True)

In [227]: %timeit pd.Series(Counter(chain.from_iterable(df1.column)))
14.3 ms ± 279 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [228]: %timeit df1.column.explode().value_counts()
127 ms ± 3.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

【讨论】:

  • @AlexHall:使用chain.from_iterable 在大数据帧上展平时,它比explodevalue_counts 快8 倍
  • 我收回了,Counter API 是用 Python 实现的,但实际计数是用 C这保证了熊猫问题?)
  • @AlexHall:没什么大不了的。干杯!众所周知,np.concatenate 在扁平化列表中比chain.from_iterable 慢。使用它而不是from_iterable 只是我懒惰的一部分。我切换到from_iterable只是为了显示Counter的真实速度:)
猜你喜欢
  • 2020-07-03
  • 2013-05-09
  • 2019-12-02
  • 1970-01-01
  • 2017-11-11
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多