Выберите столбцы на основе последнего значения в фрейме данных pandas

#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. сейчас работаю. проверил это