Pandas: переформатирование данных CSV из одного столбца в несколько новых столбцов

Я относительно новичок в 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 работает.

tdelaney 09.12.2020 20:36

Возможно df.groupby() поможет. но трудно сказать. См. комментарий @G.Anderson о том, как помочь нам помочь вам.

itaishz 09.12.2020 20:44

Спасибо за предложения по созданию лучшего вопроса @G.Anderson Сообщение было отредактировано и дополнено примером сценария.

jjkennedy 09.12.2020 21:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, все, что вам нужно сделать, это использовать список для параметра 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

Есть ли способ убедиться, что порядок столбцов не меняется?

jjkennedy 09.12.2020 22:05

Переиндексируйте этот уровень мультииндекса. Я добавил его в раствор.

RootTwo 09.12.2020 23:05

Спасибо @RootTwo! работает хорошо, и это действительно просто.

jjkennedy 09.12.2020 23:23

Другие вопросы по теме