我目前有两个 pandas 数据框:
sales = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
{'account': 'Alpha Co', 'Jan': 200, 'Feb': 210, 'Mar': 215}]
sales2 = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
{'account': 'Alpha Co', 'Jan': 200, 'Feb': 210, 'Mar': 215},
{'account': 'Blue Inc', 'Jan': 50, 'Feb': 90, 'Mar': 95 }]
test_1 = pd.DataFrame(sales)
test_2 = pd.DataFrame(sales2)
我想要实现的是仅显示“test_2”中的差异,而不显示“test_1”中的差异。
我当前拥有的代码连接了两个数据帧,并显示了两个数据帧之间的总差异,但是我只想查看“test_2”与“test_1”之间的差异,而不是相反:
def compare_dataframes(df1, df2):
print 'Comparing dataframes...'
df = pd.concat([df1, df2])
df = df.reset_index(drop=True)
df_gpby = df.groupby(list(df.columns))
idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
compared_data = df.reindex(idx)
if len(compared_data) > 1:
print 'No new sales on site!'
else:
print 'New sales on site!'
print(compared_data)
我怎样才能使我当前的功能适应这样的工作?
最佳答案
使用merge
带有外部连接和 indicator
参数:
df = test_1.merge(test_2, how='outer', indicator=True)
print (df)
Feb Jan Mar account _merge
0 200 150 140 Jones LLC both
1 210 200 215 Alpha Co both
2 90 50 95 Blue Inc right_only
然后按 boolean indexing
仅过滤 right_only
行:
only2 = df[df['_merge'] == 'right_only']
print (only2)
Feb Jan Mar account _merge
2 90 50 95 Blue Inc right_only
感谢 @Jon Clements 提供带有回调的单行解决方案:
only2 = test_1.merge(test_2, how='outer', indicator=True)[lambda r: r._merge == 'right_only']
print (only2)
Feb Jan Mar account _merge
2 90 50 95 Blue Inc right_only
或者使用query
:
only2 = test_1.merge(test_2, how='outer', indicator=True).query("_merge == 'right_only'")
关于python - 如何比较两个 Pandas DataFrame 并显示 DataFrame 2 中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092078/