iay*_*ork 3 python dataframe consensus pandas
我有一个如下所示的数据框:
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
Run Code Online (Sandbox Code Playgroud)
我想识别每行中最常见的字符,并计算与共识的差异总数:
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
Run Code Online (Sandbox Code Playgroud)
运行循环是一种方法,但似乎效率低下:
consensus = []
for idx in df.index:
consensus.append(df.loc[idx].value_counts().index[0])
df['Consensus'] = consensus
Run Code Online (Sandbox Code Playgroud)
(等等)
有没有一种直接的方法来获得共识并从中计算差异?
您可以使用mode来获得共识值:
>>> df.mode(axis=1)
0
0 a
1 b
2 c
3 d
Run Code Online (Sandbox Code Playgroud)
但请注意文档中的警告:
获取沿所选轴的每个元素的模式。如果没有出现 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
Run Code Online (Sandbox Code Playgroud)