У меня есть кадр данных Pandas, отсортированный по столбцу datetime. Несколько строк будут иметь одинаковую дату и время, но значение столбца «тип отчета» будет другим. Мне нужно выбрать только одну из этих строк на основе списка предпочтительных типов отчетов. Список в порядке предпочтения. Таким образом, если одна из этих строк имеет первый элемент в списке, то это строка, выбранная для добавления в новый фрейм данных.
Я пробовал GroupBy и очень медленный цикл Python for для обработки каждой группы, чтобы найти предпочтительный тип отчета и добавить эту строку в новый фрейм данных. Я думал о numpy vectorize (), но я не знаю, как включить в него группу. Я действительно не очень разбираюсь в данных, но учусь. Любые идеи о том, как сделать это быстрее? Могу ли я зарегистрировать группу?
Пример кадра данных
OBSERVATIONTIME REPTYPE CIGFT
2000-01-01 00:00:00 AUTO 73300
2000-01-01 00:00:00 FM-15 25000
2000-01-01 00:00:00 FM-12 3000
2000-01-01 01:00:00 SAO 9000
2000-01-01 01:00:00 FM-16 600
2000-01-01 01:00:00 FM-15 5000
2000-01-01 01:00:00 AUTO 5000
2000-01-01 02:00:00 FM-12 12000
2000-01-01 02:00:00 FM-15 15000
2000-01-01 02:00:00 FM-16 8000
2000-01-01 03:00:00 SAO 700
2000-01-01 04:00:00 SAO 3000
2000-01-01 05:00:00 FM-16 5000
2000-01-01 06:00:00 AUTO 15000
2000-01-01 06:00:00 FM-12 12500
2000-01-01 06:00:00 FM-16 12000
2000-01-01 07:00:00 FM-15 20000
#################################################
# The function to loop through and find the row
################################################
def select_the_one_ob(df):
''' select the preferred observation '''
tophour_df = pd.DataFrame()
preferred_order = ['FM-15', 'AUTO', 'SAO', 'FM-16', 'SAOSP', 'FM-12',
'SY-MT', 'SY-SA']
grouped = df.groupby("OBSERVATIONTIME", as_index=False)
for name, group in grouped:
a_group_df = pd.DataFrame(grouped.get_group(name))
for reptype in preferred_order:
preferred_found = False
for i in a_group_df.index.values:
if a_group_df.loc[i, 'REPTYPE'] == reptype:
tophour_df =
tophour_df.append(a_group_df.loc[i].transpose())
preferred_found = True
break
if preferred_found:
break
del a_group_df
return tophour_df
################################################
### The function which calls the above function
################################################
def process_ceiling(plat, network):
platformcig.data_pull(CONNECT_SRC, PULL_CEILING)
data_df = platformcig.df
data_df = select_the_one_ob(data_df)
При полном наборе данных в 300 000 строк функция занимает более 4 часов.
Мне нужно, чтобы это было намного быстрее. Могу ли я включить группу с помощью функции numpy vectorize ()?