根据多列的条件,从另一个数据帧更新列的某些值



我的数据帧1:

id    filler       ent    seg    val     text
1     M,0-10       CP     BEC    20       abc
2     M,10-20      D      BWC    30       abc
3     Y,0-10       CP     CCD    40       abc
4     Y,10-20      D      CFC    50       abc

数据帧2:

id    filler       ent    seg    val     text
1     M,0-10       CP     BEC    20       xyz
2     Y,10-20      D      CFC    50       xyz

需要创建结果数据帧:

id    filler       ent    seg    val     text
1     M,0-10       CP     BEC    20       xyz
2     M,10-20      D      BWC    30       abc
3     Y,0-10       CP     CCD    40       abc
4     Y,10-20      D      CFC    50       xyz

其中它检查除了文本之外的所有列是否具有相同的值,然后通过数据帧2更新数据帧1,我的数据帧1具有100行,而数据帧2具有20行。

您可以执行数据帧2到数据帧1的左合并,并使用指示符列查找数据帧1中需要更新的值。

columns = ['id','filler','ent','seg','val','text']
df1 = pd.DataFrame([
[1, 'M,0-10','CP','BEC',20, 'abc'],
[2,'M,10-20','D','BWC',30,'abc'],
[3,'Y,0-10','CP','CCD',40,'abc'],
[4,'Y,10-20','D','CFC',50,'abc'],
], columns=columns)
df2 = pd.DataFrame([
[1,'M,0-10','CP','BEC',20,'xyz'],
[4,'Y,10-20','D','CFC',50,'xyz'],
], columns=columns)

将数据帧2合并到数据帧1上,带有指示列

columns_merge = [x for x in columns if x!='text']
updated = df1.merge(df2, on=columns_merge, how='left', indicator=True)

根据指标列比较和设置需要更新的内容。

same = updated['_merge']=='both'
updated.loc[same,'text_x'] = updated.loc[same,'text_y']

删除&重命名列

updated.drop(columns=['text_y','_merge'], inplace=True)
updated.rename(columns = {'text_x': 'text'}, inplace=True)

更新=

id   filler ent  seg  val text
0   1   M,0-10  CP  BEC   20  xyz
1   2  M,10-20   D  BWC   30  abc
2   3   Y,0-10  CP  CCD   40  abc
3   4  Y,10-20   D  CFC   50  xyz

最新更新