Надеюсь, кто-нибудь сможет мне помочь в этом. У меня есть несколько фреймов данных, которые содержат значение, соответствующее идентификатору и имени. Для каждого идентификатора мне нужно максимальное значение для всех фреймов данных, но теперь я также должен указать, для какого имени возникло это максимальное значение.
В примере показаны только два фрейма данных, но на самом деле у меня есть около 100, который также содержит около 100 идентификаторов, поэтому я не могу просто взять максимум, а затем проверить, какие значения содержатся в одном из фреймов данных, и взять оттуда имя.
Я пробовал использовать groupby, но не смог заставить его работать.
import pandas as pd
d1 = pd.DataFrame()
d2 = pd.DataFrame()
d1['id'] = [1,2,3,4,5]
d2['id'] = [1,2,3,4,5]
d1['max'] = [10,20,30,40,50]
d2['max'] = 25
d1['name'] = 'name_1'
d2['name'] = 'name_2'
df_max_list=[d1, d2]
df_max_out=pd.concat(df_max_list).groupby(level=0).max()
Получил результат:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_2
3 4 40 name_2
4 5 50 name_2
Ожидаемый результат:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_1
3 4 40 name_1
4 5 50 name_1
Вы можете установить id
в качестве индекса и использовать где:
tmp1 = d1.set_index('id')
tmp2 = d2.set_index('id')
out = out = tmp1.where(tmp1['max'].gt(tmp2['max']), tmp2).reset_index()
Если ваши фреймы данных уже выровнены по id
, вы можете упростить приведенное выше:
out = d1.where(d1['max'].gt(d2['max']), d2)
Выход:
id max name
0 1 25 name_2
1 2 25 name_2
2 3 30 name_1
3 4 40 name_1
4 5 50 name_1
@Регина, я упустила тот факт, что у тебя 100 фреймов данных, в данном случае лучше concat
Вы можете использовать .idmax()
, чтобы найти максимальное значение max для каждой группы.
# Concat and reset index
df_tot = pd.concat(df_max_list, ignore_index=True)
# Groupby on id and select index for maximum value of 'max' for each group
df_max_out = df_tot.loc[df_tot.groupby('id')['max'].idxmax()]
выход:
id max name
5 1 25 name_2
6 2 25 name_2
2 3 30 name_1
3 4 40 name_1
4 5 50 name_1
Вы можете удалить индексы при конкатенации, т. е. pd.concat(df_max_list, ignore_index=True)
Спасибо, отлично работает! Просто подумайте, что у вас опечатка в df_max_out line
Спасибо обоим. Я исправил опечатку и изменил конкат на предложение Дэниела Митра.
Спасибо, но как это будет работать со 100 кадрами данных? Не будет ли это очень медленно?