通过Pandas计算每行共识的差异

时间:2016-03-18 16:54:25

标签: python pandas dataframe consensus

我有一个如下所示的DataFrame:

import pandas as pd
df = pd.DataFrame({'A':['a','b','c','d'],'B':['a','b','c','x'],'C':['y','b','c','d']})
df

   A  B  C
0  a  a  y
1  b  b  b
2  c  c  c
3  d  x  d

我想确定每行中最常见的字符,以及与共识的差异总数:

       A  B  C Consensus
    0  a  a  y         a
    1  b  b  b         b
    2  c  c  c         c
    3  d  x  d         d
Total  0  1  1         0

运行循环是一种方法,但似乎效率低下:

consensus = []
for idx in df.index:
    consensus.append(df.loc[idx].value_counts().index[0])
df['Consensus'] = consensus

(依此类推)

是否有直接的方式来达成共识并计算差异?

1 个答案:

答案 0 :(得分:4)

您可以使用mode获取共识值:

>>> df.mode(axis=1)
   0
0  a
1  b
2  c
3  d

请注意文档中的警告:

  

获取沿所选轴的每个元素的模式。如果没有2次出现,则为空。为每个标签的每个模式添加一行,用nan填充空白。

     

请注意,可能会为所选轴返回多个值(当多个项共享最大频率时),这就是返回数据帧的原因。如果你想用数据帧df中的模式来计算缺失值,你可以这样做:df.fillna(df.mode()。iloc [0])

要计算每个列的共识中的差异,您可以与ne进行比较,然后求和:

>>> df['consensus'] = df.mode(axis=1)
>>> df.loc[:, 'A':'C'].ne(df['consensus'], axis=0).sum(axis=0)
A    0
B    1
C    1
dtype: int64