在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这两行。