首页 > 解决方案 > 连接两个 DF,不包括不在一个 df 中的行

问题描述

我有两个熊猫 dfs:

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]

DF 包含数以千计的事件和个人。我需要连接两个 dfs,以使生成的 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().

有没有办法连接这两个 dfs 以获得与我上述预期输出匹配的结果 df?我相信最终的 df 应该是 8737 x 38 列的大小。

标签: pythonpandasdataframeconcatenation

解决方案


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_subset,我们就可以合并。

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')

推荐阅读