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

时间:2020-06-26 06:43:30

标签: python pandas dataframe

我想根据“马”列比较数据框。我想查找特定马匹在数据帧1中的“赔率”大于数据帧2中的“ AvgOdds”的行。例如,这将是数据帧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行。

2 个答案:

答案 0 :(得分:0)

我假设您的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中的“赔率”大于数据框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']]

答案 1 :(得分:0)

#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