熊猫-如果同一行的其他值出现在第二个数据框中,则替换列的值

时间:2018-07-12 13:33:26

标签: python pandas dataframe replace

输入是两个数据帧。下面是它们的简短版本,只有几行。

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,以防该行(意味着NoType)也出现在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  |
+-----+------+------+

谢谢:)

3 个答案:

答案 0 :(得分:3)

mergenumpy.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