我正在尝试计算pandas df的嵌套列的唯一值,这是手动注释的结果。 假设我们有以下df:
df_test = pd.DataFrame(data=dict(x=["A","B","C","D"], values=["33 53 51 42 41 40 39", "33 53 51 42 41 40 39", "33 51 42 41 40 39", "33 51 42 41 40 39"]))
产生的结果:
x values
0 A 33 53 51 42 41 40 39
1 B 33 53 51 42 41 40 39
2 C 33 51 42 41 40 39
3 D 33 51 42 41 40 39
我的两个目标如下:
list_unique = []
for i in range(len(df_test["values"])):
for j in pd.Series(df_test["values"].iloc[i].split(" ")).unique():
list_unique.append(j)
list(set(list_unique))
除了嵌套列的所有唯一元素之外,获取诸如value_counts()之类的东西的最佳方法是什么?会是什么样子:
33 4
39 4
40 4
41 4
42 4
51 4
53 2
非常感谢。
答案 0 :(得分:3)
使用Series.str.split
,通过DataFrame.stack
重塑形状,然后调用Series.value_counts
:
s = df_test["values"].str.split(expand=True).stack().value_counts()
print(s)
51 4
33 4
42 4
41 4
39 4
40 4
53 2
dtype: int64
如果需要DataFrame
:
df1 = s.rename_axis('val').reset_index(name='count')
print(df1)
val count
0 51 4
1 33 4
2 42 4
3 41 4
4 39 4
5 40 4
6 53 2
答案 1 :(得分:2)
一种方法是str.split
字符串列,使用itertools.chain
展平它们,并根据结果构建collections.Counter
:
from collections import Counter
from itertools import chain
pd.Series(Counter(chain.from_iterable(df_test['values'].str.split())))
33 4
53 2
51 4
42 4
41 4
40 4
39 4
dtype: int64
添加比较时间:
df = pd.concat([df_test]*10_000)
%timeit pd.Series(Counter(chain.from_iterable(df['values'].str.split())))
# 79.2 ms ± 5.78 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df["values"].str.split(expand=True).stack().value_counts()
# 278 ms ± 29.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)