python/pandas将列折叠为日期时间季度
我有一个数据框架,其中有一组列以“YYYY-MM”格式标记,还有一些其他列。我需要将日期列折叠成日历季度,然后取平均值;我可以手动完成,但在我的真实数据中有几百个日期列,我不想手动映射其中的每一个。我从CSV生成初始df;我在python/pandas将列折叠为日期时间季度,python,pandas,Python,Pandas,我有一个数据框架,其中有一组列以“YYYY-MM”格式标记,还有一些其他列。我需要将日期列折叠成日历季度,然后取平均值;我可以手动完成,但在我的真实数据中有几百个日期列,我不想手动映射其中的每一个。我从CSV生成初始df;我在read_csv中没有看到任何看起来有用的东西,但是如果有什么我可以利用的,那就太好了。我发现将datetime对象转换为quarter的dataframe.dt.to_period(“Q”),但如果可以的话,我不太确定如何在这里应用它 下面是一个示例df(代码如下): 这
read_csv
中没有看到任何看起来有用的东西,但是如果有什么我可以利用的,那就太好了。我发现将datetime对象转换为quarter的dataframe.dt.to_period(“Q”)
,但如果可以的话,我不太确定如何在这里应用它
下面是一个示例df(代码如下):
这段代码将完成我正在寻找的功能,但我必须手动生成映射:
mapping={'2016-04':'2016q2','2016-05':'2016q2','2016-06':'2016q2','2016-07':'2016q3','2016-08':'2016q3'}
df=df.set_index(['foo','bar']).groupby(映射,轴=1.mean().reset_index()
新df:
foo-bar 2016q2 2016q3
0 6 5 3.666667 4.5
1 9 3 8.000000 7.5
2 8 5 6.000000 6.5
3 5 8 2.000000 5.5
4 4 5 3.333333 4.0
生成初始df的代码:
df=pd.DataFrame(np.random.randint(1,11,大小=(5,7)),列=('foo','bar','2016-04','2016-05','2016-06','2016-07','2016-08')),'2016-07','2016-08'))
使用应用于索引值的可调用函数。使用axis=1
将其应用于列值
(df.set_index(['foo', 'bar'])
.groupby(lambda x: pd.Period(x, 'Q'), axis=1)
.mean().reset_index())
foo bar 2016Q2 2016Q3
0 6 5 3.666667 4.5
1 9 3 8.000000 7.5
2 8 5 6.000000 6.5
3 5 8 2.000000 5.5
4 4 5 3.333333 4.0
解决方案非常简短: 从将“每月”列复制到另一个数据帧并转换开始 要索引的列名: 然后,为了得到结果,按季度对列重新采样, 计算平均值(每个季度),并加入2个“初始”列:
可能重复:您可以尝试类似于
pd.PeriodIndex(pd.to_datetime(df.columns[2:])、freq='Q').map(str)的方法,而不是手动转换列名
@jml首先将年份列和其他列分开,然后应用groupby with period index函数,在该函数之后只传递年份列,并将此数据框与数据框的其他字段连接在一起。输出如下:这是完美的,正是我想要的。非常感谢。
(df.set_index(['foo', 'bar'])
.groupby(lambda x: pd.Period(x, 'Q'), axis=1)
.mean().reset_index())
foo bar 2016Q2 2016Q3
0 6 5 3.666667 4.5
1 9 3 8.000000 7.5
2 8 5 6.000000 6.5
3 5 8 2.000000 5.5
4 4 5 3.333333 4.0
df2 = df.iloc[:, 2:]
df2.columns = pd.PeriodIndex(df2.columns, freq='M')
df.iloc[:, :2].join(df2.resample('Q', axis=1).agg('mean'))
data = [[2,2,2,3,3,3],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5],[1,2,2,3,4,5]]
df = pd.DataFrame(data, columns = ['A','1996-04','1996-05','2000-07','2000-08','2010-10'])
# separate year columns and other columns
# separate year columns
df3 = df.iloc[:, 1:]
# separate other columns
df2 = df.iloc[:,0]
#apply groupby using period index
df3=df3.groupby(pd.PeriodIndex(df3.columns, freq='Q'), axis=1).mean()
final_df = pd.concat([df3,df2], axis=1)
print(final_df)