我有关于重新采样DataFrame的问题。
import pandas as pd
df = pd.DataFrame([['2005-01-20', 10], ['2005-01-21', 20],
['2005-01-27', 40], ['2005-01-28', 50]],
columns=['date', 'num'])
# Convert the column to datetime
df['date'] = pd.to_datetime(df['date'])
# Resample and aggregate results by week
df = df.resample('W', on='date')['num'].sum().reset_index()
print(df.head())
# OUTPUT:
# date num
# 0 2005-01-23 30
# 1 2005-01-30 90
一切都按预期工作,但我想更好地了解resample()
,['num']
和sum()
到底做了什么。
问题#1
为什么会发生以下情况:
df.resample('W', on='date')
的结果是DatetimeIndexResampler
。
df.resample('W', on='date')['num']
的结果是pandas.core.groupby.SeriesGroupBy
。
df.resample('W', on='date')['num'].sum()
的结果是
date
2005-01-23 30
2005-01-30 90
Freq: W-SUN, Name: num, dtype: int64
问题#2
有没有办法在不重新取样的情况下产生相同的结果?例如,使用groupby
。
答案 0 :(得分:2)
<强>正确答案为强>
正如docs所说,.resample
会返回Resampler
个对象。因此,您获得DatetimeIndexResampler
因为date
是日期时间对象。
现在,您获得<pandas.core.groupby.SeriesGroupBy
,因为您正在根据Series
对象从数据框中查找Resampler
。
哦顺便说一句,
df.groupby([pd.Grouper(key='date', freq='W-SUN')])['num']
会回来
<pandas.core.groupby.SeriesGroupBy
也是如此。
现在,当您执行.sum()
时,您将获得所请求的数据帧轴的总和。您得到的是Series
,因为您对pandas.core.series.Series
进行了总结。
<强> ANSWER2 强>
您可以在Grouper的帮助下使用groupby
获得结果,如下所示:
df.groupby([pd.Grouper(key='date', freq='W-SUN')])['num'].sum()
输出:
date
2005-01-23 30
2005-01-30 90
Name: num, dtype: int64