按月份重塑Pandas数据框

5
任务是将下面的表格转换为:
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

有没有一种快速的pandas关键方法来解决这个问题?

4个回答

7

在您的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())

enter image description here


1
这个更优雅!帽子很漂亮! - Mohammad Yusuf
1
@MYGz 我看到了你的,有点嫉妒... 10分钟后,我也有了自己的 /耸肩 - piRSquared

3
你可以像这样做:
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

输出:

在这里输入图片描述


注:此内容涉及IT技术,仅供参考。

谢谢,这非常接近我所需要的。 - Pat

2
唯一的变化是您需要将DF unstack以将其转换为宽格式。一旦获得整数月份,您可以通过指定%m指令作为要考虑的格式来将其转换为datetime。在获得此后,使用strftime来检索其字符串表示形式。
通过指定axis=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)

enter image description here


1
谢谢,这似乎对我来说是正确的答案。我会保持问题开放一段时间。 - Pat
@Pat,坦白地说,piRSquared的答案更好。应该选择他的答案。 - Nickil Maveli

0

你可以通过以下方式添加额外的Year列:

df['Year'] = df.sum(axis=1)

它将按行对数据框进行求和(由于axis=1),并将其存储在新列中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接