Python将两个数据帧与Group By进行比较

时间:2018-02-15 13:57:06

标签: python pandas numpy dataframe

我有两个数据框。例如:

df1:
ID Value1 Country Value2 Desc Value3
AA 5.442  US       6.32  desc1 7.02   
BB 7.442  IN       2.32  desc2 5.02
CC 3.442  JP       4.32  desc3 2.02
DD 2.442  AU       5.32  desc4 6.02

df2:
ID Value1 Country Value2 Desc Value3
AA 5.3    US       5.12  desc1 7.02   
BB 7.12   UK       1.32  desc2 5.02
CC 3.542  JP       2.12  desc3 2.02
DD 2.4    AU       5.82  desc4 6.02

我需要比较这两个数据帧(假设ID是索引),我需要比较其他列,如“Value1”,“Country”等。如果列是数值,我需要找到它的差异,并需要检查它是否超出容差限制(例如,如果它达到> 10%),我需要将该记录标记为差异并写入到一个新的数据框,其中包含哪些列已更改以及更改了多少,如:

ID Column_Name df1_value df2_value difference
AA Value1      5.442     5.3       0.142  
BB Country     IN        UK        <blank>

我尝试连接两个数据框并尝试按ID分组,但不知道如何继续进行分组。

concat_df = pd.concat([df1, df2], axis=0)
grouped = concat_df.groupby('ID')

在分组数据框内,我为每个ID获取两行,我不知道如何根据其类型检查每个列值。如果type是numeric,我需要找到差异,如果type是string,我需要进行equals比较。

1 个答案:

答案 0 :(得分:0)

保持简单:

concat_df['diff12'] = (concat_df['v1'] - concat_df['v2']) / concat_df['v2']
concat_df['diff34'] = (concat_df['v3'] - concat_df['v4']) / concat_df['v4']
mask = (concat_df['diff12'] > 0.10) | (concat_df['diff34'] > 0.10)
concat_df = concat_df[mask]

您可以遍历要检查的所有列。如果您的示例中有重复的列名,则可能需要在执行pd.concat时添加MultiIndex级别。