Я относительно новичок в python и использую Pandas для манипулирования научными данными. У меня есть 79 наборов данных в формате CSV несовместимых спутниковых изображений значений пикселей (много NaN), которые были усреднены до двухмесячных значений (два месяца усредняются вместе). Формат данных аналогичен примеру фрейма данных "df". Фактические данные временных рядов охватывают период с 1985 по 2020 год, а снимок экрана внизу показывает их фактический формат для справки.
df = pd.DataFrame({'grouping': ['F-M', 'A-M', 'J-J', 'A-S', 'O-N', 'D-J', 'F-M', 'A-M', 'J-J', 'A-S', 'O-N', 'D-J'],
'year': ['1985', '1985','1985','1985','1985','1985', '1986','1986','1986','1986','1986','1986'],
'region_1': ['NaN', 0.264, 0.339, 0.321, 0.305, 'NaN', 'NaN', 0.404, 0.206, 0.217, 0.266, 0.217 ],
'region_2': ['NaN', 0.457, 0.649, 0.625, 0.531, 'NaN', 0.503, 0.656, 0.437, 0.568, 0.547, 'NaN' ]})
Мне нужно переформатировать данные, чтобы каждая строка соответствовала одному году, а каждые два месяца группировались как заголовок столбца. Однако в каждом наборе данных есть две области, которые необходимо сравнивать друг с другом. «Апрель-май район 1» и «Апрель-май район 2». Окончательный набор данных будет выглядеть примерно так:
df2 = pd.DataFrame({'year':['1985', '1986'],
'F-M reg_1': ['NaN', 'NaN'],
'A-M reg_1': [0.264, 0.404],
'J-J reg_1': [0.339, 0.206],
'A-S reg_1': [0.321, 0.217],
'O-N reg_1': [0.305, 0.266],
'D-J reg_1': ['NaN', 0.217],
'F-M reg_2': ['NaN', 0.503],
'A-M reg_2': [0.457, 0.656],
'J-J reg_2': [0.649, 0.437],
'A-S reg_2': [0.635, 0.568],
'O-N reg_2': [0.531, 0.547],
'D-J reg_2': ['NaN', 'NaN']})
Я пытался использовать следующий код, но не знаю, как включить данные region_2 в фрейм данных. Он также создает значение индекса и называет его «группировкой» и перемешивает порядок двухмесячной группировки.
df.pivot(index='year', columns = 'grouping', values = ('region_1')).reset_index()
Было бы лучше создать два отдельных фрейма данных для каждого региона?
Я также не могу найти сообщения, которые показывают, как это сделать.
Если вы можете прочитать это в фрейме данных, то df.to_csv("test.csv")
запишет его. Вы можете обрезать этот файл и опубликовать его. Фактически, df = pd.read_csv(io.StringIO("""csv content"""))
использование многострочной строки содержимого csv работает.
Возможно df.groupby()
поможет. но трудно сказать. См. комментарий @G.Anderson о том, как помочь нам помочь вам.
Спасибо за предложения по созданию лучшего вопроса @G.Anderson Сообщение было отредактировано и дополнено примером сценария.
Я думаю, все, что вам нужно сделать, это использовать список для параметра values
:
bimonths = ['F-M', 'A-M', 'J-J', 'A-S', 'O-N', 'D-J']
df.pivot(index='year', columns = 'grouping', values = ['region_1','region_2']).reindex(bimonths, axis=1, level=1)
Вывод (выравнивание столбцов испорчено вырезанием и вставкой):
region_1 region_2
grouping F-M A-M J-J A-S O-N D-J F-M A-M J-J A-S O-N D-J
year
1985 NaN 0.264 0.339 0.321 0.305 NaN NaN 0.457 0.649 0.625 0.531 NaN
1986 NaN 0.404 0.206 0.217 0.266 0.217 0.503 0.656 0.437 0.568 0.547 NaN
Есть ли способ убедиться, что порядок столбцов не меняется?
Переиндексируйте этот уровень мультииндекса. Я добавил его в раствор.
Спасибо @RootTwo! работает хорошо, и это действительно просто.
См. Как сделать хорошие примеры панд и показать пример ввода и ожидаемого вывода, а также код для того, что вы пробовали до сих пор на основе ваших собственных исследований, чтобы сделать минимально воспроизводимый пример, чтобы мы могли лучше понять, как помогать