【问题标题】:How to make a simple frequency table in Pandas如何在 Pandas 中制作简单的频率表
【发布时间】:2019-10-12 15:20:53
【问题描述】:

我需要在 Pandas 数据框中按行计算整数 1 到 5。例如,对于

import pandas as pd

df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})

   c1  c2   c3  c4
0   3   3  2.0   1
1   1   3  5.0   2
2   2   3  NaN   3    

将创建以下内容:

   n1  n2  n3  n4  n5
0   1   1   2   0   0
1   1   1   1   0   1
2   0   1   2   0   0

我遇到过.value_countscrosstab,但我无法设置任何一个来获得我需要的东西。任何帮助将不胜感激。

提前致谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以做的是像这样在数据框上使用.apply函数:

    >>> df = pd.DataFrame({'c1': [3, 1, 2], 'c2': [3, 3, 3], 'c3': [2, 5, None], 'c4': [1, 2, 3]})
    >>> df
       c1  c2   c3  c4
    0   3   3  2.0   1
    1   1   3  5.0   2
    2   2   3  NaN   3
    >>> df.apply(pd.Series.value_counts, axis=1)
       1.0  2.0  3.0  5.0
    0  1.0  1.0  2.0  NaN
    1  1.0  1.0  1.0  1.0
    2  NaN  1.0  2.0  NaN
    

    享受(: 并供参考-Count occurrences of items in Series in each row of a DataFrame

    p.s- 显然,如果一个数字不存在,它不会创建一个包含很多不存在的数字的表格,只是为了填充表格,直到最后一个数字确实存在,表格将只包含 的数字至少出现1次。

    【讨论】:

    • 很好的答案。最后也是.fillna(0)
    • 谢谢!有什么方法可以包含一个计数为 0 的列(在示例中它将是整数 4)?
    • 就像我上面的那个人回答的那样,您可以使用 .reindex 函数为 0 计数添加一列,只需弄清楚如何获取数据框中的最小和最大数字,将它们插入范围比如 -- range(min, max) 然后重新索引你的数据框,注意你正在重新索引轴 1。如果你能接受我的回答,我会很高兴的!
    • 使用重新索引。看我的回答
    【解决方案2】:

    stack + get_dummies

    df1 = pd.get_dummies(df.stack().astype(int)).sum(level=0)
    
    # Cleans up names, types, missing
    idx = range(1, 6)
    df1 = df1.reindex(idx, axis=1).add_prefix('n').fillna(0, downcast='infer')
    

       n1  n2  n3  n4  n5
    0   1   1   2   0   0
    1   1   1   1   0   1
    2   0   1   2   0   0
    

    【讨论】:

      【解决方案3】:

      你需要Series.value_counts + reindex:

      new_df=( df.apply(lambda x: x.value_counts(),axis=1)
              .reindex(columns=np.arange(1,6).astype(int))
              .fillna(0).add_prefix('n') )
      print(new_df)
      

          n1   n2   n3   n4   n5
      0  1.0  1.0  2.0  0.0  0.0
      1  1.0  1.0  1.0  0.0  1.0
      2  0.0  1.0  2.0  0.0  0.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 2013-03-13
        • 1970-01-01
        • 2020-01-24
        • 2022-08-19
        • 1970-01-01
        相关资源
        最近更新 更多