与该行另一列中的值匹配的列的Dataframe计数
如何在具有大量行的数据框中查找与指定列具有相同值的列的计数 例如,下面的df与该行另一列中的值匹配的列的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 = 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)中,请务必查看我的更新,它使用列表理解来处理可能存在的多个列,这是完美的!!正是我想要的。