这类似于MaxU's answer,但显示了一种将both日期列和非日期列(RegionName、State)分组的方法.
import numpy as np
import pandas as pd
df = pd.DataFrame({'2000-01': [53100], '2000-02': [53200], '2000-03': [53400], 'RegionName': ['Philadelphia'], 'State': ['PA']})
melted = pd.melt(df, id_vars=['RegionName', 'State'], var_name='date')
melted['date'] = pd.PeriodIndex(melted['date'], freq='Q')
result = melted.groupby(['RegionName', 'State', 'date']).mean()
result = result['value'].unstack('date')
产量
date 2000Q1
RegionName State
Philadelphia PA 53233
首先,使用pd.melt 将所有日期列合并为一个列:
import numpy as np
import pandas as pd
df = pd.DataFrame({'2000-01': [53100], '2000-02': [53200], '2000-03': [53400], 'RegionName': ['Philadelphia'], 'State': ['PA']})
melted = pd.melt(df, id_vars=['RegionName', 'State'], var_name='date')
# RegionName State date value
# 0 Philadelphia PA 2000-01 53100
# 1 Philadelphia PA 2000-02 53200
# 2 Philadelphia PA 2000-03 53400
接下来,使用pd.PeriodIndex 将日期(字符串?)转换为pd.Periods。注意pd.PeriodIndex可以将不同的日期字符串转换为同一个Period:
melted['date'] = pd.PeriodIndex(melted['date'], freq='Q')
# RegionName State date value
# 0 Philadelphia PA 2000Q1 53100
# 1 Philadelphia PA 2000Q1 53200
# 2 Philadelphia PA 2000Q1 53400
最后,使用groupby/mean 将具有相同RegionName、State 和date 的行分组并计算每个组的平均值:
result = melted.groupby(['RegionName', 'State', 'date']).mean()
# value
# RegionName State date
# Philadelphia PA 2000Q1 53233
如果你停在这里,你的 DataFrame 会很整洁(PDF)——每一行代表一个“观察”。这通常是进一步计算的最佳形式。 (此解决方案的第一步是将原始 DataFrame 转换为 tidy 格式并非偶然——请注意,melted 还具有每一行代表一个观察的属性。)
但是,如果您愿意,可以将 date 索引级别移动到单独的列中:
result = result['value'].unstack('date')