从另一个df更新列值,其中id是相同的

时间:2017-09-18 15:03:12

标签: python pandas dataframe

我有两个数据框如下

DF1

article_id col1  col2
1            2   2.5
2            5   2.5
3            3   2.5
4            8   2.5
5            2   2.5
6            5   2.5
7            1   2.5

DF2

article_id somecol3   
30           11       
6            3
22           1 
5            4 
3            7
61           8 
7            3 
df1和df2的

article_id都是唯一的。 df1和df2都有一些共同的article_id,在上面(6,5,3,7)。我想要的是,更新 df2的somecol3的值来自df1的列col1的值,其中'article_id是常见的。所以在操作之后df2应该是这样的

article_id somecol3   
30            11
6             5
22            1
5             2
3             3
61            8
7             1    

2 个答案:

答案 0 :(得分:0)

mapcombine_firstfillna

一起使用
df2['somecol3'] = (df2['article_id'].map(df1.set_index('article_id')['col1'])
                                    .combine_first(df2['somecol3'])
                                    .astype(int))
print (df2)

   article_id  somecol3
0          30        11
1           6         5
2          22         1
3           5         2
4           3         3
5          61         8
6           7         1
df2['somecol3'] = (df2['article_id'].map(df1.set_index('article_id')['col1'])
                                    .fillna(df2['somecol3'])
                                    .astype(int))
print (df2)
   article_id  somecol3
0          30        11
1           6         5
2          22         1
3           5         2
4           3         3
5          61         8
6           7         1

update的解决方案:

df2['somecol3'].update(df2['article_id'].map(df1.set_index('article_id')['col1']))
print (df2)
   article_id  somecol3
0          30        11
1           6         5
2          22         1
3           5         2
4           3         3
5          61         8
6           7         1

答案 1 :(得分:0)

使用merge

 df1.merge(df[['article_id','col1']],on='article_id',how='left').fillna('')
    Out[48]: 
       article_id col1
    0          30     
    1           6    5
    2          22     
    3           5    2
    4           3    3
    5          61     
    6           7    1

更新了

df2.merge(df1[['article_id', 'col1']], on='article_id', how='left').ffill(1).drop('somecol3',1)
Out[69]: 
   article_id  col1
0        30.0  11.0
1         6.0   5.0
2        22.0   1.0
3         5.0   2.0
4         3.0   3.0
5        61.0   8.0
6         7.0   1.0