如何对熊猫列进行多数表决

时间:2019-04-18 15:19:32

标签: python pandas

我有一个数据框,其中有10个不同的列,A1A2,...,A10。这些列包含yn。如果大多数列(yA1,...,A2)为A10,我想创建另一个值为y的列否则为n。我该怎么办?

1 个答案:

答案 0 :(得分:4)

使用DataFrame.mode

df['majority'] = df.mode(axis=1)[0]

示例

np.random.seed(0)
df = pd.DataFrame(np.random.choice(['y', 'n'], size=(10, 10)))
print(df)

   0  1  2  3  4  5  6  7  8  9
0  y  n  n  y  n  n  n  n  n  n
1  n  y  y  n  y  y  y  y  y  n
2  y  n  n  y  y  n  n  n  n  y
3  n  y  n  y  n  n  y  n  n  y
4  y  n  y  n  n  n  n  n  y  n
5  y  n  n  n  n  y  n  y  y  n
6  n  y  n  y  n  y  y  y  y  y
7  n  n  y  y  y  n  n  y  n  y
8  y  n  y  n  n  n  n  n  n  y
9  n  n  y  y  n  y  y  n  n  y

df['majority'] = df.mode(axis=1)[0]
print(df)

   0  1  2  3  4  5  6  7  8  9 majority
0  y  n  n  y  n  n  n  n  n  n        n
1  n  y  y  n  y  y  y  y  y  n        y
2  y  n  n  y  y  n  n  n  n  y        n
3  n  y  n  y  n  n  y  n  n  y        n
4  y  n  y  n  n  n  n  n  y  n        n
5  y  n  n  n  n  y  n  y  y  n        n
6  n  y  n  y  n  y  y  y  y  y        y
7  n  n  y  y  y  n  n  y  n  y        n
8  y  n  y  n  n  n  n  n  n  y        n
9  n  n  y  y  n  y  y  n  n  y        n

如果有必要处理真正多数与分裂决定之间的区别,则可以使用numpy.where。例如:

mode = df.mode(axis=1)

df['majority'] = np.where(mode.isna().any(1), mode[0], 'split')
print(df)

   0  1  2  3  4  5  6  7  8  9 majority
0  y  n  n  y  n  n  n  n  n  n        n
1  n  y  y  n  y  y  y  y  y  n        y
2  y  n  n  y  y  n  n  n  n  y        n
3  n  y  n  y  n  n  y  n  n  y        n
4  y  n  y  n  n  n  n  n  y  n        n
5  y  n  n  n  n  y  n  y  y  n        n
6  n  y  n  y  n  y  y  y  y  y        y
7  n  n  y  y  y  n  n  y  n  y    split
8  y  n  y  n  n  n  n  n  n  y        n
9  n  n  y  y  n  y  y  n  n  y    split