Python-将2个类似的熊猫数据框与条件合并

时间:2020-07-27 19:03:39

标签: python-3.x dataframe merging-data

我有2个具有相同结构的Df与条件合并。 我需要将所有ID原始但不重复,并且当存在相同ID时,我需要从val == 1的数据帧中选择一个,或者如果df1.val == df2.val则仅从df1中选择一行。 >

df1
    id   val   X1   X2   X3
0  az1     1   10   12   16
1  az2     0   15   17   19
3  az3     0    8    9   17
4  az5     1    3    2   67
5  az7     0   31    2   68

df2
    id   val   X1   X2   X3
0  az1     1   12   10   15
1  az2     1   13   15   18
3  az4     1   10    9   47
5  az6     0   33   12   68
6  az7     0   1    26   90

我想要这样的新df3:

df3
    id   val   X1   X2   X3
0  az1     1   10   12   16
1  az2     1   13   15   18
3  az3     0    8    9   17 
4  az4     1   10    9   47
5  az5     1    3    2   67
6  az6     0   33   12   68
7  az7     0   31    2   68

它包含:

  • 所有df1行
  • 所有df2行,其中df2.val == 1并且df1中不存在df2.id
  • 所有df2行,其中(df2.id == df1.id)AND df2.val == 1 AND df1.val == 0(覆盖df1原始数据)
  • 所有df2.val == 0且df1中不存在df2.id的df2行

使用命令:

Unique=pd.concat([df1, df2]).drop_duplicates(subset ="id", keep = False, inplace = False).sort_values('id')

Unique
    id   val   X1   X2   X3
0  az3     0    8    9   17 
1  az4     1   10    9   47
2  az5     1    3    2   67
3  az6     0   33   12   68

然后:

Temp = pd.concat([df1, Unique]).drop_duplicates().sort_values('id')

      Temp
    id   val   X1   X2   X3
0  az1     1   10   12   16
1  az3     0    8    9   17 
2  az4     1   10    9   47
3  az5     1    3    2   67
4  az6     0   33   12   68
5  az7     0   31    2   68

最终:

df2_1 =df2[df2["val"]==1]
df3 = pd.concat([df2_1, Temp]).drop_duplicates(subset ="id", keep = "first", inplace = False).sort_values('id')
df3
    id   val   X1   X2   X3
0  az1     1   10   12   16
1  az2     1   13   15   18
3  az3     0    8    9   17 
4  az4     1   10    9   47
5  az5     1    3    2   67
6  az6     0   33   12   68
7  az7     0   31    2   68

有人想以更快,更优雅的方式完成这项工作吗?

0 个答案:

没有答案