#python #pandas #loops #conditional-statements
Вопрос:
У меня есть фрейм данных ниже в качестве примера. Я хочу перебрать каждое wag
число и выбрать только столбцы A
или B
на основе его последнего значения. Например, если мы посмотрим на wag
== 1, то последнее значение A
== 3, тогда как последнее значение B
== 34, так что меня интересует только столбец A
, так как его значение меньше, и так далее по всему wags
. Наконец, я хочу иметь список, как показано ниже:
foo_list = [[10, 8, 7, 3], [15, 12, 5], [1, 2, 2, 1]]
import pandas as pd
foo = pd.DataFrame({
'wag' : [1, 1, 1, 1, 44, 44, 44, 56, 56, 56, 56],
'A' : [10, 8, 7, 3, 13, 22, 18, 43, 40, 38, 12],
'B' : [55, 48, 37, 34, 15, 12, 5, 1, 2, 2, 1]
})
На самом деле, может быть много столбцов для сравнения, а не только 2, как я показал. И все время мне нужно хранить в столбцах списка с минимальным последним значением среди других. Я думал for loop
, но не могу придумать, как сравнить столбцы друг с другом, а затем выбрать тот, который я хочу.
Ответ №1:
Для каждой группы получите минимальные последние значения и преобразуйте этот столбец в список, здесь установлено wag
значение «сначала индексировать» для обработки всех других столбцов, таких как A,B
:
f = lambda x: list(x.loc[:, x.iloc[-1].idxmin()])
L = foo.set_index('wag').groupby('wag', sort=False).apply(f).tolist()
print (L)
[[10, 8, 7, 3], [15, 12, 5], [1, 2, 2, 1]]
Комментарии:
1. ты опередил меня в этом
2. да, меня интересует только последнее значение в столбце, и оно должно быть меньше, чем в другом столбце. Так что ваш подход не идеален)
3. сейчас работаю. проверил это