python - 在 python 中合并两个表(使用 pandas),其中链接取决于唯一性

标签 python pandas merge

假设我有两张 table

import pandas as pd
import numpy as np

first_table = pd.DataFrame({'key1': [1, 2, 2, 2, 3, 3],
                            'key2': ['a', 'a', 'a', 'b', 'a', 'b'],
                            'key3': ['A', 'A', 'B', 'A', 'A', 'A'],
                            'value_first': range(6)})
second_table = pd.DataFrame({'key1': [1, 1, 2, 2, 3],
                            'key2': [np.nan, np.nan, 'a', 'a', 'b'],
                            'key3': [np.nan, np.nan, 'A', 'B', np.nan],
                            'value_second': [6, 4, 2, 0, -2]})

所以第一个表看起来像这样

   key1 key2 key3  value_first
0     1    a    A            0
1     2    a    A            1
2     2    a    B            2
3     2    b    A            3
4     3    a    A            4
5     3    b    A            5

而第二个表看起来像这样

   key1 key2 key3  value_second
0     1  NaN  NaN             6
1     1  NaN  NaN             4
2     2    a    A             2
3     2    a    B             0
4     3    b  NaN            -2

现在我想要基于三个键对 first_tablesecond_table 进行外部合并。请注意,第二个表根据三个键不是唯一的,但第一个表是唯一的。因此,当 key1 在第一个表中唯一时,key2key3 不是必需的。同样,当前两个键的组合是唯一的时,key3 也不是必需的。

如果第二个表被正确填写,那么合并将很简单

pd.merge(first_table, second_table, 
         how='outer', 
         left_on=['key1', 'key2', 'key3'], 
         right_on=['key1', 'key2', 'key3'])

但是在这种情况下如何获得想要的结果呢?期望的结果如下所示

   key1 key2 key3  value_first  value_second
0   1    a    A          0.0           6.0
1   1    a    A          0.0           4.0
2   2    a    A          1.0           2.0
3   2    a    B          2.0           0.0
4   2    b    A          3.0           NaN
5   3    a    A          4.0           NaN
6   3    b    A          5.0          -2.0

最佳答案

这个想法是首先合并 key1 上的数据帧,然后用第一个表中的相应值填充 NaN,然后在值不同时删除行,最后再次与第一个表合并以获取剩余行(其中 value_second=NaN)。

df = pd.merge(first_table, second_table, left_on=['key1'], right_on=['key1'], how='outer')
df['key2_y'] = df['key2_y'].fillna(df['key2_x'])
df['key3_y'] = df['key3_y'].fillna(df['key3_x'])
df = df[(df['key2_x'] == df['key2_y']) & (df['key3_x'] == df['key3_y'])]
df.drop(['key2_y', 'key3_y'], axis=1, inplace=True)
df = pd.merge(first_table, df, left_on=['key1', 'key2', 'key3', 'value_first'], 
              right_on=['key1', 'key2_x', 'key3_x', 'value_first'], how='outer')
df.drop(['key2_x', 'key3_x'], axis=1, inplace=True)

       key1 key2 key3  value_first  value_second
0     1    a    A            0           6.0
1     1    a    A            0           4.0
2     2    a    A            1           2.0
3     2    a    B            2           0.0
4     2    b    A            3           NaN
5     3    a    A            4           NaN
6     3    b    A            5          -2.0

关于python - 在 python 中合并两个表(使用 pandas),其中链接取决于唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383777/

相关文章:

python - 设置 mod_python 解释器

python - 如何使用 Python Gekko 解决绝对值 abs() 目标?

python - 如何为 pandas groupby 结果指定列标题?

git - 列出特定文件的完整提交历史

git pull 到 branch_1 并同时 merge 到当前分支

python - Cupy OutOfMemoryError 尝试在内存映射模式下 cupy.load 较大尺寸的 .npy 文件时出现 Cupy OutOfMemoryError 错误,但 np.load 工作正常

python - 静态方法 - 如何从另一个方法调用一个方法?

javascript - 使用 Web Audio API 将多个 ArrayBuffer 合并/分层为一个 AudioBuffer

python - 找到最佳模型并将其信息放入新列中

python - 如何在 GroupBy 中满足逻辑条件的 "collapse"行