【问题标题】:Return a mode value in a dataframe Python with condition返回具有条件的数据框 Python 中的模式值
【发布时间】:2021-01-15 00:18:36
【问题描述】:

我有一个包含 9 列的数据框,如下所示:

C0  C1  C2  C3  C4  C5  C6  C7  C8

1   1   1   0   0   1   0   0   0

1   1   1   0   4   0   0   2   3

1   1   1   0   0   2   4   1   3

0   2   0   0   1   0   0   0   0

0   2   0   2   0   0   4   1   3

0   2   0   2   4   0   4   1   3

0   2   0   2   4   0   4   1   3

0   2   0   0   4   0   4   1   3

我想返回每列的模式值。我知道这可以通过在 Python 中使用 mode() 来完成。但是,我想添加条件,如果列中有 >= 3 个数字“1”,则返回 mode=1 而不是列的实模式。如果有 >=4 个数字“2”,则返回 mode=2 而不是该列的实模式。 否则,返回实模式值。

代码的输出应该是:

C0 C1 C2 C3 C4 C5 C6 C7 C8

 1  2  1  0  4  0  4  1  3

请帮助我。 谢谢。

【问题讨论】:

    标签: python pandas mode


    【解决方案1】:

    使用mode 获取模式,然后创建布尔系列来指示您是否应该更改为12

    real_mode = df.mode(axis=0)
    three_ones = (df == 1).sum(axis=0) >= 3
    four_twos = (df == 2).sum(axis=0) >= 4
    
    modified_mode = real_mode.loc[0]  # Extract the series, which gets named 0
    modified_mode[three_ones] = 1
    modified_mode[four_twos] = 2
    

    结果是

    C0    1
    C1    2
    C2    1
    C3    0
    C4    4
    C5    0
    C6    4
    C7    1
    C8    3
    Name: 0, dtype: int64
    

    【讨论】:

    • 嗨,丹,感谢您的建议。但是,我想将 C0 到 C8 保留为列,并且模式将作为连续值返回。
    • 然后将其转换为最后的 DataFrame。但其实这个系列是完全一样的。
    【解决方案2】:

    使用计数器的简单方法:

    from statistics import mode
    from collections import Counter
    
    counters = [( Counter(df[col].tolist()), col) for col in df.columns]
    modes = [ 2 if c[0][2] >= 4 else 1 if c[0][1] >= 3 else mode(df[c[1]].tolist()) for c in counters]
    

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多