Создание нового DataFrame на основе старого группового - PullRequest
1 голос
/ 15 октября 2019

Я вчера отправил этот вопрос о создании нового столбца в df. Теперь мне интересно, как создать новый фрейм данных, который содержит только крайние элементы. Например:

df = pd.DataFrame({'Event':['A','A','A','A', 'A' ,'B','B','B','B','B'],  'Number':[1,2,3,4,5,6,7,8,9,10],'Ref':[False,False,False,False,True,False,False,False,True,False]})
df["new"] = df.Number - df.Number[df.groupby('Event')['Ref'].transform('idxmax')].reset_index(drop=True)
print(df)

Это дает df в таблице 1. Теперь мне любопытно, как я мог бы создать новый df1, который является просто строками, соответствующими наибольшему абсолютному значению new. Выход будет ниже Output2. Я знаю, что могу использовать что-то вроде df1 = df.loc([df['new'].idxmin()), но это дает только строки. Я не уверен, как проходить через разные группы, а также как применять функцию numpy. Я считаю, что это один вкладыш, но я не слишком уверен, как подойти к

Выход 1:

  Event  Number    Ref  new
0     A       1  False   -4
1     A       2  False   -3
2     A       3  False   -2
3     A       4  False   -1
4     A       5   True    0
5     B       6  False   -3
6     B       7  False   -2
7     B       8  False   -1
8     B       9   True    0
9     B      10  False    1

Выход 2:

  Event  Number    Ref  new
0     A       1  False   -4
1     B       6  False   -3

1 Ответ

2 голосов
/ 15 октября 2019

Позвольте мне ответить на ваш расширенный вопрос здесь: merge

new_df = pd.merge(df.loc[df['new'].abs().groupby(df['Event']).idxmax()],
         df.loc[df['Ref'], ['Event','Number']],
         on='Event',
         suffixes=['','_ref']
        )

Вывод:

  Event  Number    Ref  new  Number_ref
0     A       1  False   -4           5
1     B       6  False   -3           9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...