我有一个名为player
的DataFrame:
player_df = pd.DataFrame(np.random.rand(10,3), columns=['x','y','more_cols'])
_____________________________________________________________________________
player_df:
x y more_cols
0 0.352673 0.479360 0.638508
1 0.764669 0.326961 0.778483
2 0.805774 0.911662 0.316030
3 0.114446 0.185147 0.318742
4 0.714803 0.646525 0.084143
5 0.061614 0.837432 0.886669
6 0.179777 0.519559 0.446562
7 0.615326 0.886046 0.581127
8 0.597375 0.196619 0.310331
9 0.670061 0.471363 0.313047
第二个DataFrame称为checkpoints_df
:
checkpoints_df = pd.DataFrame(np.random.rand(4,2), columns=['x','y'])
checkpoints_df['checkpoint_name'] = ['Alpha', 'Hotel', 'Indigo', 'Papa']
_____________________________________________________________________________
checkpoints_df:
x y checkpoint_names
0 0.616945 0.804442 Alpha
1 0.402007 0.556274 Hotel
2 0.478351 0.443920 Indigo
3 0.075494 0.803561 Papa
以及函数distance(x1,y1,x2,y2)
,其计算2个点之间的欧几里德距离,或者点的列表和点之间的欧几里德距离(x1和y1可以是列表)。
目标:我想为'checkpoints_df ['checkpoint']'中的每个检查点名称添加一列到'player_df',并用玩家到该检查点的距离填充该列(这是一个模型问题,真实的的问题可能有很多'checkpoints')
到目前为止,我已经尝试了很多方法,但最终选择了使用.iterrows()
的解决方案,但是如果有很多检查点,这可能会很慢。这是我现在使用的方法:
for _, row in checkpoints_df.iterrows():
player_df[row['name']] = distance(player_df['x'], player_df['y'], row['x'], row['y'])
我试过使用.apply()
,但无法用此方法创建列。有没有一种方法可以在不迭代第二个 Dataframe 的情况下做到这一点?
2条答案
按热度按时间roejwanj1#
如果你的
distance
函数是向量化的,你可以做:或者,完全矢量化:
输出:
vyswwuz22#
下面是一种利用numpy广播来创建所需输出的简洁方法:
样品输入:
输出: