在带条件的数据框Python中返回模式值

问题描述

我有一个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”,则返回模式= 1而不是列的实模式。并且如果有> = 4数字“ 2”,则返回mode = 2而不是列的实模式。 否则,返回实模式值。

代码输出应为:

C0 C1 C2 C3 C4 C5 C6 C7 C8

 1  2  1  0  4  0  4  1  3

请帮助我。 谢谢。

解决方法

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

天真的方法:

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]