Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按月份重塑数据帧_Python_Pandas_Sum_Pivot_Time Series - Fatal编程技术网

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分钟后,我有了自己的/耸肩的手帕,这似乎是我的正确答案。“我会在短时间内保留这个问题。”帕特,坦率地说,皮尔斯夸德的答案要好得多。应该和他的一个一起去。