Python 如何使用pandas将一列的值与同一行中的多列进行比较?

Python 如何使用pandas将一列的值与同一行中的多列进行比较?,python,pandas,apply,Python,Pandas,Apply,我有一个如下所示的数据帧: np.random.seed(21) df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B1', 'B2', 'B3']) df['current_State'] = [df['B1'][0], df['B1'][1], df['B2'][2], df['B2'][3], df['B3'][4], df['B3'][5], df['B1'][6], df['B2'][7]] df 我需要创建一个新列

我有一个如下所示的数据帧:

np.random.seed(21) 
df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B1', 'B2', 'B3'])
df['current_State'] = [df['B1'][0], df['B1'][1], df['B2'][2], df['B2'][3], df['B3'][4], df['B3'][5], df['B1'][6], df['B2'][7]]
df 

我需要创建一个新列,其中包含“current_State”值相同的列的名称,这是所需的输出:


我尝试了许多apply和lambda函数的组合,但没有成功。欢迎任何帮助

您可以将
当前_状态
列与所有剩余列进行比较,以创建一个布尔掩码,然后在此
掩码上沿
轴=1
使用,以获取列的名称,其中给定行中的值等于
当前_状态
中的对应值:

c = 'current_State'
df['new_column'] = df.drop(c, 1).eq(df[c], axis=0).idxmax(1)
如果可能没有匹配值,我们可以使用:

c = 'current_State'
m = df.drop(c, 1).eq(df[c], axis=0)
df['new_column'] = m.idxmax(1).mask(~m.any(1))


考虑到OP只发布了一张图片,答案很好(不赞成)。很好奇你是如何获得数据帧的值的(希望你是手工输入的)?非常感谢@Shubham,谢谢你的回答,这是一个非常优雅的解决方案,在我的情况下效果非常好谢谢@DarrylG我没有手动输入值:)我想你错过了问题中给出生成示例数据帧的代码的部分。@Dianamesesgustin很高兴我能帮上忙@ShubhamSharma——是的,我没听到那句话。谢谢你指出这一点。在完整的帖子中,对OP问题(加上你的答案)进行了投票。
>>> df

          A        B1        B2        B3  current_State new_column
0 -0.051964 -0.111196  1.041797 -1.256739      -0.111196         B1
1  0.745388 -1.711054 -0.205864 -0.234571      -1.711054         B1
2  1.128144 -0.012626 -0.613200  1.373688      -0.613200         B2
3  1.610992 -0.689228  0.691924 -0.448116       0.691924         B2
4  0.162342  0.257229 -1.275456  0.064004       0.064004         B3
5 -1.061857 -0.989368 -0.457723 -1.984182      -1.984182         B3
6 -1.476442  0.231803  0.644159  0.852123       0.231803         B1
7 -0.464019  0.697177  1.567882  1.178556       1.567882         B2