我有一个df
中的邮政编码坐标列表
print(df)
out[0]:
X Y Postcode
84060.2933273726 452334.434562507 2543
842443.2065506417 452310.49440726795 2544
78129.7656972764 450394.36304550205 2542
76143.40136149981 452922.516876715 2551
我还有一个活动文件(df2
(,坐标未知,由NaN表示。
print(df2)
out[1]:
OrigLoc DestLoc O_X O_Y D_X D_Y
0 2515 2515 82190.12097 454778.5460 81694.8038 454266.4303
1 2515 2544 81203.80496 453952.5966 NaN NaN
2 2544 2515 NaN NaN 81759.58454 454494.4784
3 2515 2543 81573.1442 454424.602 NaN NaN
如何通过从df
中获取X和Y坐标的数据来填充O_X、O_Y、D_X和D_Y中的NaN?我尝试过使用pd.merge,但由于我想为多列查找值,这是否意味着我必须执行pd.mergo 4次?有没有更有效的方法可以做到这一点?感谢您的帮助!
合并将获得原点或目的地的坐标,因此两次合并就足够了:
>>> orig = df2.reset_index().merge(df, left_on='OrigLoc', right_on='Postcode')
... .set_index('index')[['X', 'Y']].add_prefix('O_')
>>> orig
O_X O_Y
index
2 842443.206551 452310.494407
>>> dest = df2.reset_index().merge(df, left_on='DestLoc', right_on='Postcode')
... .set_index('index')[['X', 'Y']].add_prefix('D_')
>>> dest
D_X D_Y
index
1 842443.206551 452310.494407
3 84060.293327 452334.434563
请注意,这些orig
和dest
数据帧的列名与您在df
中的坐标相同:O_X
、O_Y
、D_X
、D_Y
。您还应该注意允许保留原始索引的reset_index
和set_index
步骤−merge
通常会擦除该列。所有这些都允许我们保留这些值应该填充df2
中哪些单元格的信息。
我们现在可以简单地使用fillna
来填补df:中的空白
>>> df2.fillna(dest).fillna(orig)
OrigLoc DestLoc O_X O_Y D_X D_Y
0 2515 2515 82190.120970 454778.546000 81694.803800 454266.430300
1 2515 2544 81203.804960 453952.596600 842443.206551 452310.494407
2 2544 2515 842443.206551 452310.494407 81759.584540 454494.478400
3 2515 2543 81573.144200 454424.602000 84060.293327 452334.434563