Skip to main content

双表操作

数据对比

对比某一列

比如现在有两个 DataFrame : df1df2,都有某一列id ,现在想对比两个数据框的id是否完全一致

如果不用 pandas 的话,最笨的办法当然是写个循环比较自然的想法是写个循环,一个值一个值的对比。

但是我希望,即使可以不用 pandas 的内置函数,至少你要记得使用集合进行操作

identical_ids = set(df1['id']) == set(df2['id'])
print("id 完全一致:", identical_ids)

当然,pandas 也提供了内部的函数.isin,再结合.all()

# 检查 df1 中的 id 是否都在 df2 中
df1_in_df2 = df1['id'].isin(df2['id']).all()

# 检查 df2 中的 id 是否都在 df1 中
df2_in_df1 = df2['id'].isin(df1['id']).all()

print("df1 中的所有 id 都在 df2 中:", df1_in_df2)
print("df2 中的所有 id 都在 df1 中:", df2_in_df1)
Tips

.all():这是一个 DataFrame 或 Series 对象的方法,用于检查序列中的所有元素是否都为 True。如果所有元素都是 True,则返回 True;如果任何一个元素是 False,则返回 False。

那如果不一致,怎么找出不一致的id呢?

# 找出只在 df1 中的 id
only_in_df1 = set(df1['id']) - set(df2['id'])

# 找出只在 df2 中的 id
only_in_df2 = set(df2['id']) - set(df1['id'])

print("只在 df1 中的 id:", only_in_df1)
print("只在 df2 中的 id:", only_in_df2)

匹配对比

更多的时候,是类似 Excel 中 Vlookup 的对比,比如 df1df2,都有某一列id,也还都有某一列 value

现在希望找到,相同 id 对应的 value 是否也一样,有哪些办法呢?

  • 1、使用 merge,根据 编号 进行匹配,然后看有没有匹配不到的值
merged_df = pd.merge(df1, df2, on='编号', suffixes=('_df1', '_df2'))

# 检查日期是否一致
merged_df['日期一致'] = merged_df['日期_df1'] == merged_df['日期_df2']
print(merged_df)
  • 使用 join()

只要将两个 DataFrame 的索引都修改成编号,就可以使用 join 进行操作

df1.set_index('编号', inplace=True)
df2.set_index('编号', inplace=True)

# 连接 DataFrame
joined_df = df1.join(df2, lsuffix='_df1', rsuffix='_df2')

# 检查日期是否一致
joined_df['日期一致'] = joined_df['日期_df1'] == joined_df['日期_df2']
print(joined_df)
  • 使用 concat() 检查

也可以将两个 DataFrame 纵向合并,然后进行分组比较。

concat_df = pd.concat([df1, df2.rename(columns={'日期': '日期_df2'})], ignore_index=True)

# 通过分组比较
result = concat_df.groupby('编号').agg(lambda x: x.nunique() == 1)
print(result[['日期', '日期_df2']])

最后如果不一样,输出不一样的内容应该怎么操作呢?

# 合并 DataFrame
merged_df = pd.merge(df1, df2, on=' id', suffixes=('_df1', '_df2'))

# 检查value是否一致
merged_df['value一致'] = merged_df['value_df1'] == merged_df['value_df2']

# 打印是否有不一致的情况
if not merged_df['value一致'].all():
print("存在不一致的value")

inconsistent = merged_df[~merged_df['value一致']]
print(inconsistent[['id', 'value_df1', 'value_df2']])
else:
print("所有id的value都一致")