根据列内的值比较两个数据框
Posted
技术标签:
【中文标题】根据列内的值比较两个数据框【英文标题】:Comparing two dataframes based on values within column 【发布时间】:2020-06-26 06:43:30 【问题描述】:我想根据“马”列比较数据框。我想找到特定马的数据框 1 中的“赔率”大于数据框 2 中的“平均赔率”的行。例如,这将是“Indian Sounds”的数据帧 1 中的第 0 行和第 1 行。我希望输出包括“比赛”、“马”、“博彩公司”和“赔率与平均赔率之间的差异”。
数据框 1:
Race Horse Bookmaker Odds
0 Bath R2 Indian Sounds BetEasy 2.65
1 Bath R2 Indian Sounds Neds 2.45
2 Bath R2 Indian Sounds Sportsbet 2.20
3 Bath R2 Hello BetEasy 4.2
4 Bath R2 Hello Neds 4.1
5 Bath R2 Hello Sportsbet 4
数据框 2:
Horse AvgOdds
0 Indian Sounds 2.43
1 Hello 4.1
构建数据框的代码:
cols1 = ['Race', 'Horse', 'Bookmaker', 'Odds']
df1 = pd.DataFrame(data=data1, columns=cols1)
cols2 = ['Race', 'Horse', 'Bookmaker', 'AvgOdds']
df2 = pd.DataFrame(data=data1, columns=cols2)
df3 = df2.groupby(by='Horse', sort=False).mean()
df3 = df3.reset_index()
df4 = round(df3,2)
df1[df1['Odds'] > df4['AvgOdds']])
当我使用此代码时,我收到一条错误消息,说只能比较具有相同标签的 Series 对象。我认为这是因为它试图将数据帧 1 中的第 0 行与数据帧 2 中的第 0 行进行比较,依此类推,这不起作用,因为数据帧 1 中有更多行。我需要它来引用第 0 行数据帧 1 中的 -2 和数据帧 2 中的第 0 行,然后数据帧 1 中的第 3-5 行和数据帧 2 中的第 1 行。
【问题讨论】:
你能把你的问题作为一个最小的可重现问题吗? ***.com/questions/20109391/… 【参考方案1】:我假设您的 df 列如下所示:
df1=pd.DataFrame(
'Race':['Bath R2','Bath R2','Bath R2','Bath R2','Bath R2','Bath R2'],
'Horse':['Indian Sounds','Indian Sounds','Indian Sounds','Hello','Hello','Hello'],
'Bookmaker':['BetEasy','Neds','Sportsbet','BetEasy','Neds','Sportsbet'],
'Odds':[2.65,2.45,2.20,4.2,4.1,4]
)
df2=pd.DataFrame(
'Horse':['Indian Sounds','Hello'],
'AvgOdds':[2.43,4.1]
)
如果您想知道数据框 1 中的“Odds”大于数据框 2 中的“AvgOdds”的行,您可以进行如下内连接和过滤:
#merge df1 and df2 based on Horse column
result_df=pd.merge(df1,df2,on='Horse',how='inner')
#filter out the rows wher Odds are greater than AvgOdds
result_df[result_df['Odds']>result_df['AvgOdds']]
【讨论】:
【参考方案2】:#df1=df1.assign(AvgOdds=df1.Horse.map(dict(zip(df2.Horse,df2.AvgOdds))))
d=dict(zip(df2.Horse,df2.AvgOdds))#dict the columns in df2
df1['AvgOdds']=df1.Horse.map(d)#using dict map the values of df2 to df1
df1[df1['Odds']-df1['AvgOdds']>0]#Boolean select where differences are greater than zero
Race Horse Bookmaker Odds AvgOdds
0 Bath R2 Indian Sounds BetEasy 2.65 2.43
1 Bath R2 Indian Sounds Neds 2.45 2.43
3 Bath R2 Hello BetEasy 4.20 4.10
【讨论】:
这有帮助吗?这是一个更快的解决方案以上是关于根据列内的值比较两个数据框的主要内容,如果未能解决你的问题,请参考以下文章