df_1 = {'budget_id':['1', '2', '3', '4'],
'budget_amount':[200, 300, 400, 500]}
df_2 = {'budget_id':['1', '2', '3', '4', '5'],
'budget_amount':[200, 300, 400, 550, 700]}
df_1.compare(df_2, align_axis=0, keep_equal=True).rename(index={'self': 'Prev', 'other': 'New'}, level=1)
df.compare()的期望输出:
budget_id budget_amount
4 550
5 700
我有两个数据帧,我希望使用df.compare进行比较。它们都有相同的列和索引标签。
但是,我不能保证它们具有相同的行数。这将导致问题,因为compare期望两个具有相同形状的df。
我需要知道是否添加了新行作为比较的一部分。
最好的解决方案是将空白行附加到任何数据帧,直到它们相等?你会怎么做呢?
有更优雅的方式吗?
merge
是否适合您:
(df_1.merge(df_2, on='budget_id', how='right')
.query('budget_amount_x != budget_amount_y')
)
输出:
budget_id budget_amount_x budget_amount_y
3 4 500.0 550
4 5 NaN 700
这是我根据Giovanni Frison的评论写的解决方案。
def compare_dataframes(df_1, df_2):
if df_1.equals(df_2):
return pandas.DataFrame()
else:
#Get indexes of rows present in df_2, but not in df_1
new_row_indexes = df_2.index.difference(df_1.index)
new_rows = df_2.loc[new_row_indexes]
#Create second index to match df.compare output
new_rows[''] = 'New'
new_rows = new_rows.set_index('',append=True)
#Drop new rows from df_2 to create same shape for df.compare
df_2 = df_2.drop(new_row_indexes)
compare_df = df_1.compare(df_2, align_axis=0, keep_equal=True).rename(index={'self': 'Prev', 'other': 'New'}, level=1)
compare_df = compare_df.append(new_rows)
return compare_df