根据列内的值比较两个数据框

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

【讨论】:

这有帮助吗?这是一个更快的解决方案

以上是关于根据列内的值比较两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

怎么用按键精灵将EXCEL表A1列内的数字逐个复制粘贴到某网页搜索框搜索

Flutter中列内的容器之间不需要的间距

比较两个数据框中列的值

使用 GroupBy 合并组内的两个数据框

根据条件验证R中两个数据框之间的列中的值

DataFrame:将列内的数组转换为 RDD[Array[String]]