Pandas: как найти первый допустимый столбец среди ряда столбцов

#python #pandas #numpy #feature-extraction

#python #pandas #numpy #функция-извлечение

Вопрос:

У меня есть набор данных из разных разделов расы в фрейме данных pandas, из которого мне нужно вычислить определенные функции. Это выглядит примерно так:

 id         distance     timeto1000m    timeto800m    timeto600m   timeto400m   timeto200m    timetoFinish
1          1400m        10             21            30           39           50            60    
2          1200m        0              19            31           42           49            57   
3          1800m        0              0             0            38           49            62   
4          1000m        0              0             29           40           48            61
  

Итак, что мне нужно сделать, это для каждой строки найти первый timetoXXm ненулевой столбец и соответствующее расстояние XX . Например, для id=1 этого будет 1000m, для id=3 этого будет 400m и т.д.

Я могу сделать это с помощью ряда if..elif..else условий, но мне было интересно, есть ли лучший способ выполнить такой поиск в pandas / numpy?

Ответ №1:

Вы можете сделать это следующим образом: сначала отфильтруйте интересующие столбцы и возьмите фрагмент, затем вызовите idxmin интересующие столбцы, чтобы вернуть столбцы, в которых выполняется логическое условие:

 In [11]:
df_slice = df.ix[:,df.columns.str.startswith('time')]
df_slice[df_slice!=0].idxmin(axis=1)

Out[11]:
0    timeto1000m
1     timeto800m
2     timeto400m
3     timeto600m
dtype: object

In [15]:
df['first_valid'] = df_slice[df_slice!=0].idxmin(axis=1)
df[['id','first_valid']]

Out[15]:
   id  first_valid
0   1  timeto1000m
1   2   timeto800m
2   3   timeto400m
3   4   timeto600m
  

Ответ №2:

используйте idxmax(1)

 df.set_index(['id', 'distance']).ne(0).idxmax(1)

id  distance
1   1400m       timeto1000m
2   1200m        timeto800m
3   1800m        timeto400m
4   1000m        timeto600m
dtype: object