如何加入/合并数据集?

Posted

技术标签:

【中文标题】如何加入/合并数据集?【英文标题】:How to Join / Merge datasets? 【发布时间】:2017-09-17 13:08:50 【问题描述】:

我有两个数据框 DF1DF2。我的目标是使用DF1 列查找DF2 钥匙;并将返回结果作为结果保存在DF3 中。有人可以帮我得到 DF3?

例如

DF1                         DF2
map test1   test2           No.     outcome
A   NaN     NaN             1       AA
B   NaN     5               2       BB
C   1       6               3       CC
D   2       7               4       DD
E   3       NaN             5       EE
F   4       NaN             6       FF
G   5       8               7       GG
H   6       9               8       HH
I   7       10              9       II
                            10      JJ
                            11      KK
                            12      LL
                            13      MM

DF3
map test1   test2   outcome1        outcome2
A   NaN     NaN     NaN             NaN
B   NaN     5       NaN             EE
C   1       6       AA              FF
D   2       7       BB              GG
E   3       NaN     CC              NaN
F   4       NaN     DD              NaN
G   5       8       EE              HH
H   6       9       FF              II
I   7       10      GG              JJ

我目前正在使用两个连接函数,但这不是我需要的。它在DF1 中删除NaNs,并且只返回test1test2 的重叠部分。

df3 = df1.merge(df2, how='inner', left_on='test1', right_on='No.')
df3 = df3.merge(df2, how='inner', left_on='test2', right_on='No.')

目前我的代码会返回这个:

DF3 映射测试1 测试2 结果1 结果2 C 1 6 AA FF D 2 7 BB GG G 5 8 EE HH H 6 9 FF II I 7 10 GG JJ

【问题讨论】:

i.stack.imgur.com/h2RoV.png 什么是“数据集”(因为它不是任何内置 Python 数据类型的名称)? 抱歉给您带来了困惑。我的意思是熊猫数据框 使用两条语句来实现这个有什么问题? 数据框也不是内置的。我已经相应地更新了您问题的标签。 【参考方案1】:

在这种情况下地图会更有效

DF3 = DF1.copy()
DF3['outcome1'] = DF1['test1'].map(DF2.set_index('No.')['outcome'])
DF3['outcome2'] = DF1['test2'].map(DF2.set_index('No.')['outcome'])

    map test1   test2   outcome1    outcome2
0   A   NaN     NaN     NaN         NaN
1   B   NaN     5.0     NaN         EE
2   C   1.0     6.0     AA          FF
3   D   2.0     7.0     BB          GG
4   E   3.0     NaN     CC          NaN
5   F   4.0     NaN     DD          NaN
6   G   5.0     8.0     EE          HH
7   H   6.0     9.0     FF          II
8   I   7.0     10.0    GG          JJ

【讨论】:

【参考方案2】:

你喜欢代码高尔夫吗?

pd.merge(pd.merge(df1, df2, how='left',left_on='test1',right_on='No.'),df2, how='left',left_on='test2',right_on='No.').drop(['No._x','No._y'], axis=1).rename(columns='outcome_x':'outcome1','outcome_y':'outcome2')

  map  test1  test2 outcome1 outcome2
0   A    NaN    NaN      NaN      NaN
1   B    NaN    5.0      NaN       EE
2   C    1.0    6.0       AA       FF
3   D    2.0    7.0       BB       GG
4   E    3.0    NaN       CC      NaN
5   F    4.0    NaN       DD      NaN
6   G    5.0    8.0       EE       HH
7   H    6.0    9.0       FF       II
8   I    7.0   10.0       GG       JJ

【讨论】:

苏卡,这太棒了。所以本质上,我使用 how = 'inner' 进行合并,但应该使用 how = 'left'。

以上是关于如何加入/合并数据集?的主要内容,如果未能解决你的问题,请参考以下文章

连接/加入/合并两个缺少一列的数据框

按复杂标准合并/加入 2 个数据帧

如何根据条件合并两个数据集

如何加入 Spark 数据集 A 和 B 并标记 A 中未加入的记录?

在两个键上加入/合并两个查询集

如何在合并数据集之前检查行是不是存在(SQL Server)