Python Groupby на пользовательских скобках значений - PullRequest
0 голосов
/ 17 сентября 2018

У меня вопрос, связанный с python groupby. Я получил этот фрейм данных здесь:

    latlong               hour  formula_value_x
0   -37.853698 145.0562584  0   978.880733
1   -37.853698 145.0562584  1   535.458975
2   -37.853698 145.0562584  2   370.082577
3   -37.853698 145.0562584  3   348.519570
4   -37.853698 145.0562584  4   524.588282
5   -37.853698 145.0562584  5   1310.520435
6   -37.853698 145.0562584  6   3440.724656
7   -37.853698 145.0562584  7   5839.008447
8   -37.853698 145.0562584  8   6024.170196
9   -37.853698 145.0562584  9   5000.579879
10  -37.853698 145.0562584  10  4697.686943

Мне нужно запустить groupby в 1-ых 2 столбцах (latlong и hours) и найти максимум. Но мне нужно запустить группу по часам в скобках, например, 0-5, 6-10, 11-16,17-20, 20-23.

 df1.groupby(['latlong','hour'])['formula_value_x'].quantile(1) 

- это основной способ сделать это без скобок. Как я могу сделать это с этими скобками часов?

Так, например, для определенного значения latlong, groupby примет все свои значение формула за часы [0,1,2,3,4,5], а затем примет их макс. После нахождения максимума для таких скобок часов мне нужно создать новый столбец, который будет иметь максимальное значение (выяснено ранее), и он будет рядом с часом, принадлежащим той же скобке.

Итак .. Мне нужен такой результат:

    latlong               hour  formula_value_x    max
0   -37.853698 145.0562584  0   978.880733        1310.520435
1   -37.853698 145.0562584  1   535.458975        1310.520435
2   -37.853698 145.0562584  2   370.082577        1310.520435
3   -37.853698 145.0562584  3   348.519570        1310.520435
4   -37.853698 145.0562584  4   524.588282        1310.520435
5   -37.853698 145.0562584  5   1310.520435       1310.520435
6   -37.853698 145.0562584  6   3440.724656       6024.170196
7   -37.853698 145.0562584  7   5839.008447       6024.170196 
8   -37.853698 145.0562584  8   6024.170196       6024.170196
9   -37.853698 145.0562584  9   5000.579879       6024.170196
10  -37.853698 145.0562584  10  4697.686943       6024.170196

1 Ответ

0 голосов
/ 17 сентября 2018

Самый простой способ - сгруппировать часы в новый столбец «часовая группа» и работать с этим.

df.loc[df.hour.isin([0, 1, 2, 3, 4, 5]), 'hourgroup'] = 'HG1'
df.loc[df.hour.isin([6, 7, 8]), 'hourgroup'] = 'HG2'
....

Затем соберите сгруппированные значения в новом фрейме данных. Я разделяю lat / long на два поля из-за пробелов в вашем примере, которые разделяют их при импорте.

df2 = df.groupby(['lat', 'long', 'hourgroup'])['formula_value_x'].max().reset_index()

Дайте сгруппированному максимуму лучшее имя. Макс это плохое имя, потому что функция Макс существует.

df2.rename(columns={'formula_value_x': 'max_value_x'}, inplace=True)

Объединить его с исходным фреймом данных

df_result = df.merge(df2, on=['lat', 'long', 'hourgroup'], how='left')

print(df_result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...