Pandas -使用df.compare比较两个长度不等的df


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

相关内容

  • 没有找到相关文章

最新更新