【问题标题】:Compare elements in dataframe columns for each row - Python比较每一行的数据框列中的元素 - Python
【发布时间】:2019-05-01 02:29:47
【问题描述】:

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

   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 中做到这一点??? 谢谢!!

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

这是使用列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

【讨论】:

    【解决方案2】:

    为了获得良好的性能,您可以使用底层的 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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2020-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多