如何在一行一列地逐行比较Pandas数据帧?

时间:2019-08-15 22:56:38

标签: python pandas dataframe

让我们考虑两个数据帧

df1=
 A    B    C   D  E    F  G
 a1   b1  c1  d1  e1  f1  1
 a2   b2  c2  d2  e2  f2  3
 a3   b3  c3  d3  e3  f2  5
 a4   b4  c4  d4  e4  f4  Nan

df2=
 A    B    C   D  E    F  G
 a1   b1  c1  d1  e1  f1  1
 a2   b2  c2  d2  e2  f2  3
 a3   b3  c3  d3  e3  f2  4
 a4   b4  c4  d4  e4  f4  Nan
 a5   b5  c5  d5  e5  f5  7

我想比较G列上的两个数据帧,但是只有在每个数据帧中的每一行都具有相同值的情况下,我们才应该这样做。因此,从A到F,如果df1和df2中的每一行都相同,则会生成一列称为结果,它显示df1中的G列-df2中的G列,以产生这样的数据帧。

resultdf=
 A    B    C   D  E    F G_DF1 G_DF2  Result
 a1   b1  c1  d1  e1  f1   1     1     0
 a2   b2  c2  d2  e2  f2   3     3     0
 a3   b3  c3  d3  e3  f2   5     4     1
 a4   b4  c4  d4  e4  f4  Nan    Nan   Nan

df2中的行号5应该被丢弃。

我尝试了

result=pd.merge(df1, df2, on=[A,B,C,D,E,F]) but it doesn't seem to work. 

2 个答案:

答案 0 :(得分:2)

首先,我们以通用的方式获取列名,而无需使用iloctolist对其进行硬编码。然后,我们在这些列上merge。最后,我们assign您的Result列和drop G列:

cols = [col for col in df2.columns if col != 'G']
df2 = df2.merge(df1, on=cols)
df2.assign(Result=df2['G_y'] - df2['G_x']).drop(columns=['G_x', 'G_y'])

输出

    A   B   C   D   E   F  Result
0  a1  b1  c1  d1  e1  f1     0.0
1  a2  b2  c2  d2  e2  f2     0.0
2  a3  b3  c3  d3  e3  f2     1.0
3  a4  b4  c4  d4  e4  f4     NaN

或者我们可以使用apply在一个衬里中执行此操作,但这不是我的首选解决方案:

cols = [col for col in df2.columns if col != 'G']

df2.set_index(cols).merge(df1.set_index(cols), 
                          left_index=True,
                          right_index=True).apply(lambda x: x['G_x'] - x['G_y'], axis=1)\
                                           .reset_index(name="Result")

答案 1 :(得分:1)

我认为这应该可行:

 result = df1.merge(df2, on=['A','B','C','D','E','F'], suffixes=('_DF1','_DF2')).reset_index()
 result['Result'] = result['G_DF1'] - result['G_DF2']