我有两个数据框,一个保存数据集的大部分数据,第二个保存我在稍后的时间点获得的一些其他数据。

在下面的示例中,我想用在df_main.b中找到的值替换df_additional.b中存储的值,并且应该通过使用两个数据帧中在列order_id下找到的映射来知道要使用哪些值。

In [385]: df_main = pd.DataFrame({'order_id':['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'], 'b':[1,2,3,4,5,6,7], 'c':np.random.randn(7), 'd':np.random.randn(7)})

In [386]: df_additional = pd.DataFrame({'order_id':['A1', 'A2', 'A3', 'A5', 'A6', 'A7', 'A8'], 'b':['a','b','c','d','e','f','g']})

In [387]: df_main
Out[387]:
   b         c         d order_id
0  1  0.460474 -1.092239       A1
1  2  0.872538  1.819610       A2
2  3 -0.343626 -2.493006       A3
3  4  0.489427  0.074341       A4
4  5 -1.690572  0.162746       A5
5  6 -0.851540  0.543129       A6
6  7 -0.559258 -0.170457       A7

In [388]: df_additional
Out[388]:
   b order_id
0  a       A1
1  b       A2
2  c       A3
3  d       A5
4  e       A6
5  f       A7
6  g       A8


请注意,df_main.order_id中的值与df_additional.order_id不同。

我希望针对df_main.b中而不是np.nan中存在的这些订单,df_main转到df_additional(例如,'A4',因此df_main['b'][3]应该转到np.nan

我也希望忽略所有存在于df_additional中而不存在于df_main中的订单,而在df_main中没有添加任何新内容。

最终输出应为:

>>> final_version
   b            c         d order_id
0  a     0.460474 -1.092239       A1
1  b     0.872538  1.819610       A2
2  c    -0.343626 -2.493006       A3
3  NaN   0.489427  0.074341       A4
4  d    -1.690572  0.162746       A5
5  e    -0.851540  0.543129       A6
6  f    -0.559258 -0.170457       A7


感谢您的帮助

编辑
我已经尝试使用np.where()获得以下结果:

In [389]: df_main.b = np.where(df_main.order_id == df_additional.order_id, df_additional.b, np.nan)

In [390]: df_main
Out[390]:
     b         c         d order_id
0    a  0.460474 -1.092239       A1
1    b  0.872538  1.819610       A2
2    c -0.343626 -2.493006       A3
3  NaN  0.489427  0.074341       A4
4  NaN -1.690572  0.162746       A5
5  NaN -0.851540  0.543129       A6
6  NaN -0.559258 -0.170457       A7


事情进展到一定程度,但是似乎比较是逐元素进行的,因此在某个点('A4' != 'A5')失败,从那一点开始,所有比较也都失败了。是否可以对isin中的所有order_id值使用某种形式的df_main,获取索引,并为该索引检索b值(?)

最佳答案

您正在寻找merge

pd.merge(df_additional, df_main, how='right', on='order_id')

#Out[13]:
#   b_x order_id  b_y         c         d
#0    a       A1    1 -2.532221  0.702512
#1    b       A2    2  2.550224 -0.649286
#2    c       A3    3  0.737817  0.999865
#3    d       A5    5 -0.484483  1.153589
#4    e       A6    6  0.526035  0.335695
#5    f       A7    7 -0.901915 -1.312429
#6  NaN       A4    4 -0.905911  0.865345

09-11 18:35