问题描述
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
获取模式,然后创建布尔级数以指示是否应更改为1
或2
:
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]