使用其他数据框作为查询来修改一个数据框的值

时间:2019-01-18 10:44:48

标签: python pandas dataframe

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

2 个答案:

答案 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)

可能不是最理想的解决方案,但这可行

  1. 创建一个名为value的指示器列,用于指示何时存在匹配项。

  2. 基于键agename

  3. 合并两个数据帧
  4. 然后使用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