我有一个数据框:
data = np.array([[10,50,75,'test1','test2','test3'],
[1000,500,175,'test1','test2','test3'],
[500,50,750,'test1','test2','test3'],
[1,500,5,'test1','test2','test3'],
[50,500,15,'test1','test2','test3']])
df = pd.DataFrame(data, columns = ['distance_1', 'distance_2','distance_3', 'distance_1_rep', 'distance_2_rep', 'distance_3_rep'])
df.distance_1 = df.distance_1.astype('int64')
df.distance_2 = df.distance_2.astype('int64')
df.distance_3 = df.distance_3.astype('int64')
我正在使用
找到 distance_1,2,3 colmns 之间的最小距离df['min_distance'] = df[['distance_1','distance_2','distance_3']].min(axis=1)
现在我想导出另一列:
给出对应于 distance_1, distance_2, distance_3 的最小值的 distance_1_rep 或 distance_2_rep 或 distance_3_rep 值
对于输出,值应该是
[test1,test3,test2,test1,test3]
我将如何推导出它?
答案 0 :(得分:2)
这本质上是一个 lookup
问题,我们首先选择 distance
列,然后使用 argmin
沿 axis=1
找到最小值的索引,然后使用这些索引查找对应的 _rep
列中的值
c = df.filter(regex='distance_\d+$')
df['new_col'] = df[c.columns + '_rep'].values[df.index, c.values.argmin(1)]
distance_1 distance_2 distance_3 distance_1_rep distance_2_rep distance_3_rep new_col
0 10 50 75 test1 test2 test3 test1
1 1000 500 175 test1 test2 test3 test3
2 500 50 750 test1 test2 test3 test2
3 1 500 5 test1 test2 test3 test1
4 50 500 15 test1 test2 test3 test3
答案 1 :(得分:0)
有一个选项可以使用 np.where 根据条件选择列:
np.where(df.min_distance==df.distance_1, df.distance_1_rep,
np.where(df.min_distance==df.distance_2, df.distance_2_rep,
df.distance_3_rep)
)
根据条件返回具有适当 distance_x_rep 选择的 pd.Series 对象。如果您有很多列并且表示不是恒定的,则将其嵌入到采用数据帧、条件列表和表示列表并递归运行的函数中可能是更好的选择。
类似于:
def representations(df, list_of_conditions, list_of_repr):
#list of repr should have len longer by 1 than list of conditions
if list_of_conditions:
return np.where(list_of_conditions[0], df[list_of_repr[0]],
representations(df, list_of_conditions[1:], list_of_repr[1:]))
else:
return df[list_of_repr[0]]