与该行另一列中的值匹配的列的Dataframe计数

与该行另一列中的值匹配的列的Dataframe计数,dataframe,Dataframe,如何在具有大量行的数据框中查找与指定列具有相同值的列的计数 例如,下面的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

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

例如,下面的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

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

一旦你有了
BC\u max
为什么不重新使用它:

def get_bc_freq(行):
如果(row.B==row.BC_max)和(row.C==row.BC_max):
返回2
elif(row.B==row.BC_max)或(row.C==row.BC_max):
返回1
返回0
df['freq']=df.apply(lambda行:get\u bc\u freq(行),轴=1)
或者更漂亮的一行:

df['freq']=df.apply(lambda行:[row.B,row.C]。计数(row.BC_max),轴=1)

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

cols\u to\u use=['B','C']
df['freq']=df.apply(lambda行:[row[x]表示要使用的列中的x]。计数(row.BC\u max),轴=1)

我试图使用已计算的最大值,但在如何申请多个列方面遇到了问题。对于ex,本例中的B列和C列是两列,但在完整的df中,有数百列需要匹配。有没有办法选择行中的列列表?例如,在onliner-df['freq']=df.apply(lambda row:[多个列]).count(row.BC_max),axis=1)中,请务必查看我的更新,它使用列表理解来处理可能存在的多个列,这是完美的!!正是我想要的。