Concat两个DF,不包括不在一个DF中的行

2024-04-29 22:33:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两只熊猫:

df1
 id_event    id_indiv        odds
0    11545      3131       0.185185
1    11545      4529       0.088106
2    11545      9168       0.055402
3    11545     12922       0.088106
4    11545     12929       0.270270
5    11545     19936       0.037523
6    11545     24703       0.202020
7    11545     25951       0.043573
8    11545     26397       0.029762
9    11545     28177       0.219780

df2
    id_event  id_indiv  final_odds
0     11545      3131    0.215054
1     11545      4526   -1.000000
2     11545      4529    0.060423
3     11545      9168    0.050251
4     11545     12922    0.060423
5     11545     12929    0.250000
6     11545     19936    0.019900
7     11545     24703    0.392157
8     11545     25951    0.052910
9     11545     26397    0.034014
10    11545     28177    0.377358

在本例中,有一个人的最终赔率为-1.00,因此很容易删除小于0的值:

df2.drop(df2[df2['final_odds']<0].index, inplace = True)

但是,运行此命令后,生成的DF大小不同:

df1
[8781 rows x 38 columns]

df2
[8737 rows x 38 columns]

DFs包含数千个事件和个人。 我需要将两个df合并,以使生成的df具有以下形状:

df3
 id_event     id_indiv       odds       final_odds        
0    11545      3131       0.185185     0.215054
1    11545      4529       0.088106     0.060423
2    11545      9168       0.055402     0.050251
3    11545     12922       0.088106     0.060423
4    11545     12929       0.270270     0.250000
5    11545     19936       0.037523     0.019900
6    11545     24703       0.202020     0.392157
7    11545     25951       0.043573     0.052910
8    11545     26397       0.029762     0.034014
9    11545     28177       0.219780     0.377358

我尝试使用此命令创建一个新的临时df,它只包含df1中存在的行,但收到一个错误:

temp_df = df1.drop(df2[df2['id_indiv'] !=df1['id_indiv'] | df2['id_event']  != df1['id_event']].index )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

是否有方法将这两个df合并,以获得与我的上述预期输出相匹配的结果df? 我认为最终df的大小应为8737 x 38列


2条回答

让我们让它变得更简单,只要做merge

df2.drop(df2[df2['final_odds'] < 0].index, inplace = True)
m = df1[['id_event','id_indiv']].agg(tuple,1).isin(df1[['id_event','id_indiv']].agg(tuple,1))
df1 = df1[m]

还有merge

df2.drop(df2[df2['final_odds'] < 0].index, inplace = True)
df1 = df1.merge(df2.drop_duplicates(['id_event','id_indiv']),how='right')

A)如果您认为id列中存在重复项

首先,让我们获取您感兴趣的df2的子集

df2_subset = df2[df2['final_odds']>=0]

# Then, eliminate duplicates based on the subset ['id_event','id_indiv']
df2_subset = df2_subset.groupby(['id_event','id_indiv'], as_index=False).nth(0)

一旦我们有了df2_子集,我们就可以合并了

df3 = df1.merge(df2, on=['id_event','id_indiv'],how='left')

B)如果您知道id列中没有重复项

你只需一行就可以解决你的问题

df3 = df1.merge(df2[df2['final_odds']>=0], on=['id_event','id_indiv'],how='left')

相关问题 更多 >