我想知道在Pandas merge中比较两个数据时如何避免不必要的重复

问题描述 投票:0回答:1
import pandas
    df1 = pandas.DataFrame(
        {
            'code': ['001', '001'],
            'name': ['test1', 'test1'],
            'date': ['2024-01-01', '2024-01-01'],
            'value1': [1, 2],
            'value2': [1, 2],
            'sum': [2, 4]
        }
    )
    df2 = pandas.DataFrame(
        {
            'code': ['001', '001', '001', '002'],
            'name': ['test1', 'test1', 'test1', 'test2'],
            'date': ['2024-01-01', '2024-01-01', '2024-01-01', '2024-02-01'],
            'value1': [1, 2, 3, 4],
            'value2': [1, 2, 3, 4],
            'sum': [2, 4, 6, 8]
        }
    )
    result = pandas.merge(df1, df2, on=['code', 'name', 'date'], how='outer', indicator=True)
    print(result[['code', 'name', 'date', 'sum_x', 'sum_y', '_merge']])

打印以上数据后,如下图所示。

  code   name        date  sum_x  sum_y      _merge
0  001  test1  2024-01-01    2.0      2        both
1  001  test1  2024-01-01    2.0      4        both
2  001  test1  2024-01-01    2.0      6        both
3  001  test1  2024-01-01    4.0      2        both
4  001  test1  2024-01-01    4.0      4        both
5  001  test1  2024-01-01    4.0      6        both
6  002  test2  2024-02-01    NaN      8  right_only

df2 中添加了两条数据。

我通过很多方法和搜索进行了研究,但我尝试的最接近的是使用合并来创建唯一值并比较它们。

但是我无法创建我想要的输出值。

我的目标是 1:1 比较 df1 和 df2 中创建的内容和丢失的内容。 我一直尝试删除合并期间不必要创建的行值,但没有成功。 我要创建的素材如下。

  code   name        date  sum_x  sum_y      _merge
0  001  test1  2024-01-01      2      2        both
4  001  test1  2024-01-01      4      4        both
5  001  test1  2024-01-01    NaN      6        right_only
6  002  test2  2024-02-01    NaN      8        right_only

我尝试使用重复数据删除和查询来删除不必要的行。 我也尝试创建特征值并比较它们,但无法创建我想要的。 我尝试使用 Stack Overflow 和 gpt 查找信息。

python pandas
1个回答
0
投票

看起来您应该将

sum
列作为键,可以选择在合并之前重命名它们:

result = pandas.merge(df1.rename(columns={'sum': 'sum_x'})
                         .drop(columns=['value1', 'value2']),
                      df2.rename(columns={'sum': 'sum_y'})
                         .drop(columns=['value1', 'value2']),
                      left_on=['code', 'name', 'date', 'sum_x'],
                      right_on=['code', 'name', 'date', 'sum_y'],
                      how='outer', indicator=True)

输出:

  code   name        date  sum_x  sum_y      _merge
0  001  test1  2024-01-01    2.0      2        both
1  001  test1  2024-01-01    4.0      4        both
2  001  test1  2024-01-01    NaN      6  right_only
3  002  test2  2024-02-01    NaN      8  right_only
© www.soinside.com 2019 - 2024. All rights reserved.