如何在不同的DataFrame中映射系列

时间:2016-04-21 09:28:37

标签: python python-3.x pandas

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

鉴于下面的示例,我想将df_main.b中存储的值替换为df_additional.b中的值,我应该知道使用{{1}列下的映射来使用哪些值},存在于两个数据帧中。

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,因此{{} 1}}应转向'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值(?)

2 个答案:

答案 0 :(得分:2)

您正在寻找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

答案 1 :(得分:0)

如果从df_additional

中的order_id列创建索引,则可以使用join()
df_additional.set_index('order_id', inplace=True)    
df_main.join(df_additional, on='order_id', how='left')

或者如果你可以从两侧的order_id列创建索引,那么就有一个简单的系列赋值。

df_main.set_index('order_id', inplace=True)
df_additional.set_index('order_id', inplace=True)    
df_main['b_add'] = df_additional['b']

如果您需要第二种情况的示例,请点击此处 10 Minutes to pandas