当列表位于pandas数据框列中时,我需要获取列表中每个元素的频率
在数据中:
din=pd.DataFrame({'x':[['a','b','c'],['a','e','d', 'c']]})`
x
0 [a, b, c]
1 [a, e, d, c]
Run Code Online (Sandbox Code Playgroud)
所需输出:
f x
0 2 a
1 1 b
2 2 c
3 1 d
4 1 e
Run Code Online (Sandbox Code Playgroud)
我可以将列表扩展成行,然后进行分组,但是此数据可能很大(百万条记录),并且想知道是否有更有效/直接的方法。
谢谢
首先展平list
s的值,然后按value_counts
or size
或or 计数Counter
:
a = pd.Series([item for sublist in din.x for item in sublist])
Run Code Online (Sandbox Code Playgroud)
要么:
a = pd.Series(np.concatenate(din.x))
Run Code Online (Sandbox Code Playgroud)
df = a.value_counts().sort_index().rename_axis('x').reset_index(name='f')
Run Code Online (Sandbox Code Playgroud)
要么:
df = a.groupby(a).size().rename_axis('x').reset_index(name='f')
Run Code Online (Sandbox Code Playgroud)
from collections import Counter
from itertools import chain
df = pd.Series(Counter(chain(*din.x))).sort_index().rename_axis('x').reset_index(name='f')
print (df)
x f
0 a 2
1 b 1
2 c 2
3 d 1
4 e 1
Run Code Online (Sandbox Code Playgroud)