派生熊猫数据框中的最小值及其各自的列派生

时间:2021-05-17 17:00:41

标签: python pandas dataframe

我有一个数据框:

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)

enter image description here

现在我想导出另一列:

给出对应于 distance_1, distance_2, distance_3 的最小值的 distance_1_rep 或 distance_2_rep 或 distance_3_rep 值

对于输出,值应该是

[test1,test3,test2,test1,test3]

我将如何推导出它?

2 个答案:

答案 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]]