#python #pandas
#python #панды
Вопрос:
Я считываю и преобразую данные, используя следующий код
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as dates
import numpy as np
df = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv', parse_dates=['Date'])
df.drop('ID', axis='columns', inplace = True)
df_min = df[(df['Date']<='2014-12') amp; (df['Date']>='2004-01') amp; (df['Element']=='TMIN')]
df_min.drop('Element', axis='columns', inplace = True)
df_min = df_min.groupby('Date').agg({'Data_Value': 'min'}).reset_index()
дает следующий результат
Date Data_Value
0 2005-01-01 -56
1 2005-01-02 -56
2 2005-01-03 0
3 2005-01-04 -39
4 2005-01-05 -94
Теперь я пытаюсь получить дату в год-месяц. Итак
Date Data_Value
0 2005-01 -94
1 2005-02 xx
2 2005-03 xx
3 2005-04 xx
4 2005-05 xx
Где xx — минимальное значение для этого года-месяца.
как мне изменить функцию Groupby или это невозможно с помощью этой функции?
Ответ №1:
Используйте pd.Grouper() для накопления по годовым / ежемесячным / ежедневным частотам.
Код
df_min["Date"] = pd.to_datetime(df_min["Date"])
df_ans = df_min.groupby(pd.Grouper(key="Date", freq="M")).min()
Результат
print(df_ans)
Data_Value
Date
2005-01-31 -94
Ответ №2:
Вы можете сначала сопоставить столбец даты, чтобы получить только год и месяц, а затем просто выполнить groupby и получить минимальное значение для каждой группы:
# import libraries
import pandas as pd
# test data
data = [['2005-01-01', -56],['2005-01-01', -3],['2005-01-01', 6],
['2005-01-01', 26],['2005-01-01', 56],['2005-02-01', -26],
['2005-02-01', -2],['2005-02-01', 6],['2005-02-01', 26],
['2005-03-01', 56],['2005-03-01', -33],['2005-03-01', -5],
['2005-03-01', 6],['2005-03-01', 26],['2005-03-01', 56]]
# create dataframe
df_min = pd.DataFrame(data=data, columns=["Date", "Date_value"])
# convert 'Date' column to datetime datatype
df_min['Date'] = pd.to_datetime(df_min['Date'])
# get only year and month
df_min['Date'] = df_min['Date'].map(lambda x: str(x.year) '-' str(x.month))
# get min value for each group
df_min = df_min.groupby('Date').min()
После печати df_min вывод должен быть:
Date_value
Date
2005-01-01 -56
2005-02-01 -26
2005-03-01 -33