Как отсортировать месяцы в месячном порядке в пределах Python Pandas при работе с файлами .CSV? - PullRequest
1 голос
/ 10 апреля 2020

Для каждого ИМЯ / МЕСТО рассчитывают среднее количество снега в месяц. Сохраните результаты в двух отдельных файлах .csv (один для 2016 года, а другой для 2017 года), назовите файлы medium2016.csv и average2017.csv. Я использовал Python 3,8 с Панадами. Я выполнил это с помощью этого кода:

import numpy as np
import pandas as pd

df = pd.read_csv('filteredData.csv')

df['DATE'] = pd.to_datetime(df['DATE'])
df['year'] = pd.DatetimeIndex(df['DATE']).year


df16 = df[(df.year == 2016)]
df17 = df[(df.year == 2017)]

df_2016 = df16.groupby(['NAME', 'Month'])['SNOW'].mean().reset_index()
df_2017 = df17.groupby(['NAME', 'Month'])['SNOW'].mean().reset_index()

df_2016[['NAME', 'Month', 'SNOW']].to_csv('average2016.csv')
df_2017[['NAME', 'Month', 'SNOW']].to_csv('average2017.csv')

Это изображение показывает мои результаты в среднем за 2016 год.

A small portion of my average2016.csv file

Однако, у меня проблема в том, что месяцы не в ежемесячном порядке. Я хочу, чтобы они go с января по декабрь для каждого местоположения. Пример: я хочу, чтобы ИМЯ: ADA 0.7 SE, MI US Month было в мае, а затем в июне. Как я смогу выполнить это? Также есть ли способ избавиться от первого пронумерованного столбца?

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете sort в столбце ДАТА. Но тогда вам нужно не забывать делать sort=False в вашей группе, иначе она будет сортироваться там, используя порядок строк. Кроме того, ваш повторяющийся код для каждого года может быть заменен одной группой, добавив year к ключам группировки. Затем вы будете писать отдельно в разные файлы, и index=False - это способ избавиться от индекса.

import numpy as np
import pandas as pd

df = pd.read_csv('filteredData.csv')

df['DATE'] = pd.to_datetime(df['DATE'])
df['year'] = df['DATE'].dt.year         # Datetime has this attribute already 

df = df.sort_values(['NAME', 'DATE'])   # Output will be in order within each Name

df = (df[df.year.between(2016,2017)]    # Only 2016 and 2017
        .groupby(['year', 'NAME', 'Month'], sort=False)['SNOW']
        .mean().reset_index())

for year,gp in df.groupby('year'):      # Write files separately by year
    gp[['NAME', 'Month', 'SNOW']].to_csv(f'average{year}.csv', index=False)
...