Python 将dataframe的两列与新dataframe列进行比较
我有两个数据帧,看起来像Python 将dataframe的两列与新dataframe列进行比较,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有两个数据帧,看起来像 team points 0 1 2.5 1 2 3.2 2 5 5.8 3 3 2.8 4 4 1.9 以及: 预期输出应为我提供一个新的列,其中包含获胜者(更多分数): 以下是一种使用和的方法: 或者更好的替代礼貌@user3483203 s=df2.stack().map(df1.set_index('team')['points']).unstack().idxmax(1)
team points
0 1 2.5
1 2 3.2
2 5 5.8
3 3 2.8
4 4 1.9
以及:
预期输出应为我提供一个新的列,其中包含获胜者(更多分数):
以下是一种使用和的方法:
或者更好的替代礼貌@user3483203
s=df2.stack().map(df1.set_index('team')['points']).unstack().idxmax(1)
#s.tolist() gives ['team2', 'team1', 'team1']
df2['winner']=df2.lookup(s.index,s)
print(df2)
试图避免使用
applymap
并使用lookup
+重塑
x = df.set_index('team').lookup(df2.values.ravel('F'), ["points"]*df2.size)
.reshape(df2.shape, order='F')
.argmax(1)
df2['winner'] = df2.lookup(df2.index, df2.columns[x])
仅使用的替代解决方案,以及:
我的“简单”解决方案:
df3= df2.replace(df1.set_index("team").points.to_dict())
df2["winner"]= np.where(df3.team1>=df3.team2,df2.team1,df2.team2)
欢迎来到SO。人们可以在这里帮助您调试代码,而不仅仅是为您编写代码。请您阅读并创建一个,其中包含您所做的努力和代码中出现的错误,好吗?从这个问题来看,这里使用的规则非常不清楚。谢谢@harvpan提供的信息。我对这一点还不熟悉。我会确保下一次我会把图片弄清楚。替代
applymap
的另一个方法是df2.stack().map(df1.set_index('team')['points']).unstack().idxmax(1)
,这在大输入时应该会快得多。仍然怀疑它是否能击败掉掉到numpy
@user3483203的方法同意,但会更新您的建议:)谢谢,谢谢您的帮助:)
s=df2.stack().map(df1.set_index('team')['points']).unstack().idxmax(1)
#s.tolist() gives ['team2', 'team1', 'team1']
df2['winner']=df2.lookup(s.index,s)
print(df2)
team1 team2 winner
0 1 5 5
1 2 4 2
2 3 1 3
x = df.set_index('team').lookup(df2.values.ravel('F'), ["points"]*df2.size)
.reshape(df2.shape, order='F')
.argmax(1)
df2['winner'] = df2.lookup(df2.index, df2.columns[x])
team1 team2 winner
0 1 5 5
1 2 4 2
2 3 1 3
df_match['winner']=( df_match.stack()
.map(df.set_index('team')['points'])
.unstack()
.max(axis=1)
.map(df.set_index('points')['team']) )
print(df_match)
team1 team2 winner
0 1 5 5
1 2 4 2
2 3 1 3
df3= df2.replace(df1.set_index("team").points.to_dict())
df2["winner"]= np.where(df3.team1>=df3.team2,df2.team1,df2.team2)