#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