按周划分Pandas数据框

9

我有一个包含“日期”和“数字”两列的数据框。

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd')
nums = [np.random.randint(100) for x in range(len(dates))]

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums})
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')]
df = df.drop([7,18]).reset_index(drop = True)

我需要对数据框进行分组,以便可以将每周的数据单独隔离出来。最终目标是查看每周的最大“Nums”值,并将其与下一周的最后一个值进行比较,以确定变化百分比。例如:

week1 = df[0:5]
week2 = df[5:9]
week3 = df[9:12]

In [156]: w1max = week1.Nums.max()
Out[156]: 97

In [157]: w2Last = week2.iloc[-1].Nums
Out[157]: 76

pctChange = (w2Last-w1max)/float(w1max)

In [166]: pctChange
Out[166]: -0.21649484536082475

问题在于某些星期缺少天数(例如第二周缺少星期一,第三周缺少星期五)。那么我该如何将它们分开呢?
最接近的方法似乎是使用df.resample()函数,但我不知道如何用它来进行我想要的比较。
1个回答

9
import numpy as np
import pandas as pd
np.random.seed(2016)

dates = pd.date_range('1/1/2001','1/1/2003', freq = 'd')
nums = [np.random.randint(100) for x in range(len(dates))]

df = pd.DataFrame({'Dates': dates, 'DOW': dates.strftime('%a'), 'Nums': nums})
df = df[(df.DOW != 'Sat') & (df.DOW !='Sun')]
df = df.drop([7,18]).reset_index(drop = True)

df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last'])
df2['previous_max'] = df2['max'].shift(1)
df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max']
print(df2.head())

收益率
            max  last  previous_max    change
Dates                                        
2001-01-07   83    39           NaN       NaN
2001-01-14   75    75          83.0 -0.096386
2001-01-21   97    18          75.0 -0.760000
2001-01-28   72    37          97.0 -0.618557
2001-02-04   84    24          72.0 -0.666667

df.groupbypd.Grouper 对象 结合使用,可以按周对行进行分组。您可以使用 agg 方法来查找每个组中 Numsmaxlast 值:

In [163]: df2 = df.groupby(pd.Grouper(freq='W', key='Dates'))['Nums'].agg(['max','last'])

In [164]: df2.head()
Out[164]: 
            max  last
Dates                
2001-01-07   83    39
2001-01-14   75    75
2001-01-21   97    18
2001-01-28   72    37
2001-02-04   84    24

然后使用 shift(1)max 的值向下移动一行:

In [165]: df2['previous_max'] = df2['max'].shift(1); df2.head()
Out[165]: 
            max  last  previous_max
Dates                              
2001-01-07   83    39           NaN
2001-01-14   75    75          83.0
2001-01-21   97    18          75.0
2001-01-28   72    37          97.0
2001-02-04   84    24          72.0

然后,百分比变化可以通过简单的减法和除法计算得出:
In [166]: df2['change'] = (df2['last']-df2['previous_max'])/df2['previous_max']; df2.head()
Out[166]: 
            max  last  previous_max    change
Dates                                        
2001-01-07   83    39           NaN       NaN
2001-01-14   75    75          83.0 -0.096386
2001-01-21   97    18          75.0 -0.760000
2001-01-28   72    37          97.0 -0.618557
2001-02-04   84    24          72.0 -0.666667

1
太棒了,我不知道.shift和.Grouper。 - RSHAP

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