如何获取嵌套列的唯一元素的value_counts()?

时间:2019-09-16 12:32:03

标签: python pandas dataframe

我正在尝试计算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

我的两个目标如下:

  1. 获取“值”列的唯一值,这是我通过应用发现的:
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))
  1. 此外,很有趣的是,唯一值的出现频率。

除了嵌套列的所有唯一元素之外,获取诸如value_counts()之类的东西的最佳方法是什么?会是什么样子:

33  4
39  4
40  4
41  4
42  4
51  4
53  2

非常感谢。

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)