比较两个pandas数据帧并根据结果更新一个

时间:2017-10-24 17:12:11

标签: python pandas

我有以下(简化)数据;

import pandas as pd

a = [['10', '12345', '4'], ['15', '78910', '3'], ['8', '23456', '10']]
b = [['10', '12345'], ['15', '78910'], ['9', '23456']]

df_a = pd.DataFrame(a, columns=['id', 'sku', 'quantity '])
df_b = pd.DataFrame(b, columns =['id','sku'])

我需要比较两个数据帧中的'id和'sku'列,对于那些我需要将df_a['quantity']更新为等于'0'的列。

那么,就像if语句一样?

if (df_a['id'] == df_b['id']) and (df_a['sku'] == df_b['sku']):
    df_a['quantity']=0

3 个答案:

答案 0 :(得分:3)

这应该这样做

df_a.loc[(df_b['id'] == df_a['id']) & (df_a['sku'] == df_b['sku']), 'quantity '] = 0

答案 1 :(得分:1)

不是最优雅的方式,但如果数据帧具有不同的形状,它将会起作用。

a_id_sku = df_a.id + df_a.sku
b_id_sku = df_b.id + df_b.sku

df_a.loc[a_id_sku.isin(b_id_sku), 'quantity '] = 0

让我知道这是否有效

答案 2 :(得分:1)

使用pandas merge的另一种方法:

df_a.loc[pd.merge(df_a, df_b, on = ['id', 'sku'] , how='left',
    indicator=True)['_merge'] == 'both', 'quantity'] = 0

df_a
    id  sku quantity
0   10  12345   0
1   15  78910   0
2   8   23456   10