Pandas DataFrame:给定多列的条件,请对其他一些列进行特定操作

时间:2019-11-19 00:36:12

标签: python pandas numpy dataframe

给出熊猫DataFrame:

import pandas as pd
import numpy as np
points = [[True, False, False, 2, 4, 5, 0, 6, 8, 9, 3, 9],
 [False, True, False, 3, 6, 2, 8, 9, 3, 2, 3, 0],
 [False, False, True, 8, 1, 8, 3, 6, 8, 9, 3, 2]]
df = pd.DataFrame(points, columns= ['1isObj','2isObj','3isOb',
 'X_1','X_2','X_3','Y_1','Y_2','Y_3','S_1','S_2','S_3'])

print(df)

   1isObj  2isObj   3isOb  X_1  X_2  X_3  Y_1  Y_2  Y_3  S_1  S_2  S_3
0    True   False   False    2    4    5    0    6    8    9    3    9
1   False    True   False    3    6    2    8    9    3    2    3    0
2   False   False    True    8    1    8    3    6    8    9    3    2

每行包含3点x,y顶点和其速度。每个点只有一排是目标。 我需要找到让其他观点达到目标的最快时间。

对于第0行: 点1是目标,它在(2,0)处,是找到我们首先必须使用距离公式找到2到1以及3到距离的时间:

time_2 = np.sqrt(np.square(df['X_2']-df['X_1'])+np.square(df['Y_2']-df['Y_1']))/df['S_2']

查找2到达1所需的时间。我们对3和1进行相同的操作,并将最小值作为'MinTime' 对于第1行,它将找到介于1到2和3到2之间的时间。

对所有行执行此操作,然后将其与原始数据帧一起返回。

def min_time(df):
    df['MinTime'] = #Some Operation
    return df

问题:

如何做到这一点而又不涉及遍历所有行的For循环,这是非常低效的? 我正在处理超过10万行,目标点可以在行与行之间更改。

1 个答案:

答案 0 :(得分:0)

您可以在数据框中创建新列,然后按行获取这些列中的最小值

df['time_2'] = np.sqrt(np.square(df['X_2']-df['X_1'])+np.square(df['Y_2']-df['Y_1']))/df['S_2']
df['time_3']= np.sqrt(np.square(df['X_3']-df['X_1'])+np.square(df['Y_3']-df['Y_1']))/df['S_3']

# Get the min between 'time_2' and 'time_3' for each row
df['MinTime']  = df[['time_2','time_3']].min(axis=1)