【问题标题】:How to get value_counts() of unique elements of a nested column?如何获取嵌套列的唯一元素的 value_counts()?
【发布时间】:2019-09-16 12:32:03
【问题描述】:

我正在尝试计算 pandas df 嵌套列的唯一值,这是 manuel cmets 的结果。 假设我们有以下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. 获取“values”列的唯一值,我通过应用得出的结论:
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

非常感谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用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
    

    【讨论】:

    • 这很好用,并且通过在堆叠后应用 .unique() 使第一个目标的事情变得更容易。谢谢!
    【解决方案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)
    

    【讨论】:

    • 当然,不用担心@sl4sh :)
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多