比较每一行的数据框列中的元素-Python

时间:2019-04-30 17:40:22

标签: python pandas dataframe

我有一个非常大的数据框(成千上万的行),但让我们假设它是这样的:

   A  B  C  D  E  F
0  2  5  2  2  2  2
1  5  2  5  5  5  5
2  5  2  5  2  5  5
3  2  2  2  2  2  2
4  5  5  5  5  5  5

我需要查看在每行的一组列中哪个值出现频率最高。例如,最常出现在ABC列和每行DEF列中的值,然后将它们放在另一列中。在此示例中,我的预期输出是

ABC  DEF  
 2    2     
 5    5     
 5    5     
 2    2     
 5    5     

如何在Python中完成呢??? 谢谢!

3 个答案:

答案 0 :(得分:8)

这是使用列groupby

的一种方法
mapperd={'A':'ABC','B':'ABC','C':'ABC','D':'DEF','E':'DEF','F':'DEF'}
df.groupby(mapperd,axis=1).agg(lambda x : x.mode()[0])
Out[826]: 
   ABC  DEF
0    2    2
1    5    5
2    5    5
3    2    2
4    5    5

答案 1 :(得分:4)

为了获得良好的性能,您可以使用基础的numpy数组,并使用scipy.stats.mode计算模式

from scipy import stats
cols = ['ABC','DEF']
a = df.values.reshape(-1, df.shape[1]//2)
pd.DataFrame(stats.mode(a, axis=1).mode.reshape(-1,2), columns=cols)

    ABC  DEF
0    2    2
1    5    5
2    5    5
3    2    2
4    5    5

答案 2 :(得分:3)

您尝试使用列标题索引过滤:

grp = ['ABC','DEF']
pd.concat([df.loc[:,[*g]].mode(1).set_axis([g], axis=1, inplace=False) for g in grp], axis=1)

输出:

   ABC  DEF
0    2    2
1    5    5
2    5    5
3    2    2
4    5    5