输入是两个数据帧。下面是它们的简短版本,只有几行。
df1
+-----+------+------+
| No | Type | Desc |
+-----+------+------+
| 123 | A | Bla |
| 123 | B | Bla |
| 123 | D | Bla |
| 342 | A | Bla |
| 342 | C | Bla |
| 543 | B | Bla |
| 543 | C | Bla |
+-----+------+------+
df2
+-----+------+------+
| No | Type | Desc |
+-----+------+------+
| 123 | A | Lala |
| 342 | A | Lala |
| 342 | C | Lala |
+-----+------+------+
这两个数据框都比上面的列多,但是在这种情况下,其他两个都没关系。
我想将Desc
行的列Done
的值更改为df1
,以防该行(意味着No
和Type
)也出现在df2
中。
df1
+-----+------+------+
| No | Type | Desc |
+-----+------+------+
| 123 | A | Done |
| 123 | B | Bla |
| 123 | D | Bla |
| 342 | A | Done |
| 342 | C | Done |
| 543 | B | Bla |
| 543 | C | Bla |
+-----+------+------+
谢谢:)
答案 0 :(得分:3)
将merge
与numpy.where
一起使用:
df3 = df1[['No','Type']].merge(df2, on=['No','Type'], how='left')
df3['Desc'] = np.where(df3['Desc'].notnull(), 'Done', df1['Desc'])
print (df3)
No Type Desc
0 123 A Done
1 123 B Bla
2 123 D Bla
3 342 A Done
4 342 C Done
5 543 B Bla
6 543 C Bla
答案 1 :(得分:0)
使用相同的索引和loc
来分配'Done'
。然后reset_index
df1 = df1.set_index(['No', 'Type'])
df1.loc[df2.set_index(['No','Type']).index, 'Desc'] ='Done'
df1 = df1.reset_index()
No Type Desc
0 123 A Done
1 123 B Bla
2 123 D Bla
3 342 A Done
4 342 C Done
5 543 B Bla
6 543 C Bla
答案 2 :(得分:0)
您可以找到df1
中存在行df2
并带有左合并的行,然后将Desc
更改为Done
。
mer = df1.merge(df2, on=['No', 'Type'], how='left')
mer.loc[mer['Desc_y'].notnull(), 'Desc_x'] = 'Done'
df1['Desc'] = mer['Desc_x']
输出:
No Type Desc
0 123 A Done
1 123 B Bla
2 123 D Bla
3 342 A Done
4 342 C Done
5 543 B Bla
6 543 C Bla