Python 按月份重塑数据帧
任务是转换下表Python 按月份重塑数据帧,python,pandas,sum,pivot,time-series,Python,Pandas,Sum,Pivot,Time Series,任务是转换下表 import pandas as pd import numpy as np index = pd.date_range('2000-1-1', periods=700, freq='D') df = pd.DataFrame(np.random.randn(700), index=index, columns=["values"]) df.groupby(by=[df.index.year, df.index.month]).sum() In[1]: df Out[1]
import pandas as pd
import numpy as np
index = pd.date_range('2000-1-1', periods=700, freq='D')
df = pd.DataFrame(np.random.randn(700), index=index, columns=["values"])
df.groupby(by=[df.index.year, df.index.month]).sum()
In[1]: df
Out[1]:
values
2000 1 1.181000
2 -8.005783
3 6.590623
4 -6.266232
5 1.266315
6 0.384050
7 -1.418357
8 -3.132253
9 0.005496
10 -6.646101
11 9.616482
12 3.960872
2001 1 -0.989869
2 -2.845278
3 -1.518746
4 2.984735
5 -2.616795
6 8.360319
7 5.659576
8 0.279863
9 -5.220678
10 5.077400
11 1.332519
这样看起来像这样
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000 1.2 -8.0 6.6 -6.3 1.2 0.4 -1.4 -3.1 0.0 -6.6 9.6 3.9
2001 -0.9 -2.8 -1.5 3.0 -2.6 8.3 5.7 0.3 -5.2 5.1 1.3
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Year
2000 1.2 -8.0 6.6 -6.3 1.2 0.4 -1.4 -3.1 0.0 -6.6 9.6 3.9 4.7
2001 -0.9 -2.8 -1.5 3.0 -2.6 8.3 5.7 0.3 -5.2 5.1 1.3 10.7
此外,我还需要添加一个额外的列,对每年的值进行汇总,如下所示
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000 1.2 -8.0 6.6 -6.3 1.2 0.4 -1.4 -3.1 0.0 -6.6 9.6 3.9
2001 -0.9 -2.8 -1.5 3.0 -2.6 8.3 5.7 0.3 -5.2 5.1 1.3
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Year
2000 1.2 -8.0 6.6 -6.3 1.2 0.4 -1.4 -3.1 0.0 -6.6 9.6 3.9 4.7
2001 -0.9 -2.8 -1.5 3.0 -2.6 8.3 5.7 0.3 -5.2 5.1 1.3 10.7
有没有快速解决这个问题的方法 额外的
Year
列,您可以通过执行
df['Year'] = df.sum(axis=1)
它将按行对数据帧求和(由于轴=1),并将其存储在新列中。您可以执行以下操作:
import pandas as pd
import numpy as np
index = pd.date_range('2000-1-1', periods=700, freq='D')
df = pd.DataFrame(np.random.randn(700), index=index, columns=["values"])
l = [df.index.strftime("%Y"), df.index.strftime("%b"), df.index.strftime("%d")]
df.index = l
df=df.groupby(level=[-3,-2]).sum().unstack(-1)
df['Year'] = df.sum(axis=1)
df
输出:
在您的groupby中使用strftime(“%b”)
df['values'].groupby([df.index.year, df.index.strftime('%b')]).sum().unstack()
维持月秩序
df['values'].groupby([df.index.year, df.index.strftime('%b')], sort=False).sum().unstack()
结尾处带有“年”
df['values'].groupby([df.index.year, df.index.strftime('%b')], sort=False).sum() \
.unstack().assign(Year=df.groupby(df.index.year).sum())
唯一的变化是您需要取消堆叠DF
以将其转换为宽格式。一旦获得整数月数,可以通过指定%m
指令作为要考虑的格式,将其转换为datetime
。获取此信息后,使用它通过strftime
的帮助检索其字符串表示形式
通过指定轴=1来计算各列的年数总和
np.random.seed(314)
fr = df.groupby([df.index.year, df.index.month]).sum().unstack(fill_value=0)
fr.columns = pd.to_datetime(fr.columns.droplevel(0), format='%m').strftime('%b')
fr['Year'] = fr.sum(1)
谢谢,这非常接近我需要的。这件更优雅!漂亮的帽子@MYGz我看到了你的,我是jelous。。。10分钟后,我有了自己的/耸肩的手帕,这似乎是我的正确答案。“我会在短时间内保留这个问题。”帕特,坦率地说,皮尔斯夸德的答案要好得多。应该和他的一个一起去。