df1 = pd.DataFrame(data={'name': ["John", "Mark", "Alice", "Alice"], 'age': [18, 23, 23, 27], 'luckynumber': [10, 20, 30, 40]})
df2 = pd.DataFrame(data={'name': ["Alice"], 'age': ['23']})
>>> df1
age luckynumber name
0 18 10 John
1 23 20 Mark
2 23 30 Alice
3 27 40 Alice
>>> df2
age name
0 23 Alice
我想将与luckynumber
匹配的df1
项的df2
设置为-1
。我不想更改df1
的布局。我希望像df1[df2]['luckynumber'] = -1
这样的东西可以工作,但是不行。
预期输出为:
>>> df1
age luckynumber name
0 18 10 John
1 23 20 Mark
2 23 -1 Alice
3 27 40 Alice
答案 0 :(得分:1)
首先将两个数据帧中的整数列转换为列age
,然后将参数为indicator=True
的{{3}}左连接,并检查both
的布尔掩码,最后设置的值为{ {3}}:
df2['age'] = df2['age'].astype(int)
mask = df1.merge(df2, how='left', indicator=True)['_merge'] == 'both'
df1.loc[mask, 'luckynumber'] = -1
print (df1)
name age luckynumber
0 John 18 10
1 Mark 23 20
2 Alice 23 -1
3 Alice 27 40
答案 1 :(得分:0)
可能不是最理想的解决方案,但这可行
创建一个名为value
的指示器列,用于指示何时存在匹配项。
基于键age
和name
然后使用np.where
有条件地检查是否存在匹配项,并更改列luckynumber
的值
df2['value'] = 1
df3 = pd.merge(df1, df2, left_on=['age', 'name'], right_on=['age', 'name'], how='left')
df3['luckynumber'] = np.where(df3.value == 1, -1, df1.luckynumber)
df3.drop('value', axis=1, inplace=True)
输出:
age luckynumber name
0 18 10 John
1 23 20 Mark
2 23 -1 Alice
3 27 40 Alice