【问题标题】:Dataframe count of columns matching value in another column in that row与该行另一列中的值匹配的列的数据帧计数
【发布时间】:2020-10-12 07:21:18
【问题描述】:

如何在具有大量行的数据框中查找与指定列具有相同值的列的计数。

比如下面的df有

df = pd.DataFrame(np.random.randint(0,10,size=(5, 4)), columns=list('ABCD'))
df.index.name = 'id'

     A  B   C   D
id              
0   7   6   6   2
1   6   5   3   5
2   8   8   0   9
3   0   2   8   9
4   4   3   8   5


bc_cols = ['B', 'C']
df['max'] = df[bc_cols].max(axis=1)


    A   B   C   D   BC_max
id                  
0   7   6   6   2   6
1   6   5   3   5   5
2   8   8   0   9   8
3   0   2   8   9   8
4   4   3   8   5   8

对于每一行,我们想要获取与最大值匹配的列数。我可以通过这样做。

 df["freq"] = df[bc_cols].stack().groupby(by='id').apply(lambda g: g[g==g.max()].count())


    A   B   C   D   BC_max  BC_freq
id                      
0   7   6   6   2   6       2
1   6   5   3   5   5       1
2   8   8   0   9   8       1
3   0   2   8   9   8       1
4   4   3   8   5   8       1

但事实证明这是非常低效和缓慢的。我们需要在具有数十万行的相当大的数据帧上执行此操作,因此我正在寻找一种有效的方法来执行此操作。有什么想法吗?

【问题讨论】:

    标签: dataframe


    【解决方案1】:

    一旦您拥有BC_max,为什么不重新使用它:

    def get_bc_freq(row):
      if (row.B == row.BC_max) and (row.C == row.BC_max):
        return 2
      elif (row.B == row.BC_max) or (row.C == row.BC_max):
        return 1
      return 0
    
    df['freq'] = df.apply(lambda row: get_bc_freq(row), axis=1)
    

    或者更漂亮的单线:

    df['freq'] = df.apply(lambda row: [row.B, row.C].count(row.BC_max), axis=1)
    

    更新 - 要使您使用的列更加动态,您可以使用列表理解(不确定这对性能有多大帮助,但是...):

    cols_to_use = ['B', 'C']
    df['freq'] = df.apply(lambda row: [row[x] for x in cols_to_use].count(row.BC_max), axis=1)
    

    【讨论】:

    • 我试图使用已经计算的最大值,但在如何申请多列时遇到了麻烦。例如,在此示例中,Col B 和 C 是两列,但在我们的完整 df 中,我们需要匹配数百列。有没有办法选择行中的列列表?比如在网上——df['freq'] = df.apply(lambda row: [Multiple Columns].count(row.BC_max), axis=1)
    • 肯定的 - 查看我的更新,它使用列表理解来处理潜在的许多列
    • 太完美了!!正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2015-06-27
    • 2021-11-22
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多