重新塑造熊猫数据框按月份分类

2024-04-20 12:23:30 发布

您现在位置:Python中文网/ 问答频道 /正文

任务是转换下表

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

看起来像这样

^{pr2}$

另外,我还需要添加一个额外的列,它将每年的值相加,如下所示

      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

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


Tags: importnumpydataframepandasdfdateindexas
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

输出:

enter image description here

唯一的改变是您需要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

在您的groupby中使用strftime('%b')

df['values'].groupby([df.index.year, df.index.strftime('%b')]).sum().unstack()

enter image description here


维持月的秩序

^{pr2}$

enter image description here


结尾是'Year'

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

相关问题 更多 >