pandas求两个DataFrame之间的行的差集

在Pandas中,如果你想要找到两个DataFrame之间的行的差集(即出现在一个DataFrame但不在另一个DataFrame中的行),可以使用merge()函数配合indicator=True参数,再结合条件筛选来实现。以下是一个例子:

import pandas as pd

# 假设我们有两个DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3'],
    'C': ['C0', 'C1', 'C2', 'C3']
})

df2 = pd.DataFrame({
    'A': ['A0', 'A2', 'A4'],
    'B': ['B0', 'B2', 'B4'],
    'C': ['C0', 'C2', 'C4']
})

# 首先通过outer join找出所有记录
merged = pd.merge(df1, df2, how='outer', indicator=True, on=list(df1.columns))

# 然后根据"_merge"列找出只在df1或df2出现的行
df_left_only = merged[merged['_merge'] == 'left_only']
df_right_only = merged[merged['_merge'] == 'right_only']

# 这里df_left_only就是df1相对于df2的差集,df_right_only是df2相对于df1的差集
print("df1相对于df2的差集:")
print(df_left_only)

print("\ndf2相对于df1的差集:")
print(df_right_only)

注意:这种方法的前提是两个DataFrame具有相同的列名和数据类型,并且希望基于这些列的完整匹配来查找差集。

另外,如果只是想获取两个DataFrame中不同行(依据所有列值都不相同的情况),则需要先将它们转换为Series并使用.drop_duplicates()方法保持唯一性,然后再进行集合操作,如下所示:

df1_unique_rows = df1.apply(lambda row: tuple(row), axis=1).drop_duplicates()
df2_unique_rows = df2.apply(lambda row: tuple(row), axis=1).drop_duplicates()

df1_diff_df2 = df1_unique_rows[~df1_unique_rows.isin(df2_unique_rows)]
df2_diff_df1 = df2_unique_rows[~df2_unique_rows.isin(df1_unique_rows)]

print("df1相对于df2的差集(按所有列值均不同定义):")
print(df1.iloc[df1_diff_df2.index])

print("\ndf2相对于df1的差集(按所有列值均不同定义):")
print(df2.iloc[df2_diff_df1.index])

具体例子

假设我们有两个DataFrame:

import pandas as pd

# DataFrame 1
df1 = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40]
})

# DataFrame 2
df2 = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Eve', 'Frank'],
    'Age': [25, 30, 40, 45]
})

现在我们想要找出只存在于df1但不在df2中的行(即差集),以及只存在于df2但不在df1中的行。我们可以按照上述提到的方法进行操作:

# 首先确保两个DataFrame有相同的列名和数据类型
if set(df1.columns) == set(df2.columns) and df1.dtypes.equals(df2.dtypes):
    # 使用merge方法配合indicator参数找差集
    merged = pd.merge(df1, df2, how='outer', indicator=True, on=list(df1.columns))

    df1_diff_df2 = merged[merged['_merge'] == 'left_only']
    df2_diff_df1 = merged[merged['_merge'] == 'right_only']

    print("df1相对于df2的差集:")
    print(df1_diff_df2)

    print("\n df2相对于df1的差集:")
    print(df2_diff_df1)
else:
    print("两个DataFrame的列名或数据类型不匹配,无法直接计算差集。")

# 输出:
# df1相对于df2的差集:
#     Name  Age     _merge
# 2  Charlie  35  left_only
# 3    David  40  left_only

# df2相对于df1的差集:
#     Name  Age     _merge
# 2     Eve  40  right_only
# 3   Frank  45  right_only

在这个例子中,df1相对于df2的差集是Charlie和David这两行,而df2相对于df1的差集是Eve和Frank这两行。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值