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

3

我有一个长这样的 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个回答

5
您可以使用mode来获取共识值:
>>> df.mode(axis=1)
   0
0  a
1  b
2  c
3  d

请注意文档中的警告:

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

请注意,所选轴可能返回多个值(当多个项目共享最大频率时),这就是返回dataframe的原因。如果要使用dataframe df中的mode来填充缺失值,则可以执行此操作: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接