首页 > 解决方案 > Pandas resample().size() 根据采样频率返回不同的对象类型

问题描述

我有 Pandas DataFrame,我正在使用groupby()resample()size()函数对其进行总结:

freq = upgrade.groupby("UPGRADESTRATEGY")
type(freq)
<class 'pandas.core.groupby.groupby.DataFrameGroupBy'>

print(freq.resample('Q'))
DatetimeIndexResamplerGroupby [freq=<QuarterEnd: startingMonth=12>, axis=0, closed=right, label=right, convention=e, base=0]

print(freq.resample('Y'))
DatetimeIndexResamplerGroupby [freq=<YearEnd: month=12>, axis=0, closed=right, label=right, convention=e, base=0]

令我惊讶的是,size()函数根据采样频率返回不同的类型:

代码:

print(type(freq.resample('Q').size()))
<class 'pandas.core.series.Series'>

print(type(freq.resample('Y').size()))
<class 'pandas.core.frame.DataFrame'>

输出在语义上也不同,所以我不能重复使用相同的管道来处理结果。我期望输出对象类型和输出数据的结构不依赖于我使用的采样频率。

问题:

  1. 当我使用不同的采样频率时,为什么我会因为size()函数而得到不同的对象类型?
  2. 无论指定的采样频率如何,如何更改代码以获得相同的对象类型和相同的对象结构?

我正在使用 0.23.4 版本的熊猫。

更新:

这个问题显然与数据有关。我把它归结为 10 条记录,这导致了输出类型的变化。我无法解释为什么我在这里得到不同的输出类型。按日期对值进行排序不会更改结果。

u2.dtypes
UPGRADESTRATEGY               object
SCENARIO_STARTDATE    datetime64[ns]
dtype: object

这会生成 DataFrame。

print(u2.iloc[-105:-96])
      UPGRADESTRATEGY  SCENARIO_STARTDATE
18645               b 2016-12-20 14:48:57
18646               a 2017-01-07 16:58:44
18647               b 2017-01-11 14:39:58
18648               a 2017-01-10 15:42:22
18649               a 2017-01-10 10:07:34
18650               a 2017-01-12 15:31:14
18651               a 2017-01-13 12:44:02
18652               a 2017-01-13 14:51:59
18653               a 2016-12-12 22:30:01


type(u2.iloc[-105:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size())

pandas.core.frame.DataFrame

这会生成系列。

print(u2.iloc[-104:-96])

      UPGRADESTRATEGY  SCENARIO_STARTDATE
18646               a 2017-01-07 16:58:44
18647               b 2017-01-11 14:39:58
18648               a 2017-01-10 15:42:22
18649               a 2017-01-10 10:07:34
18650               a 2017-01-12 15:31:14
18651               a 2017-01-13 12:44:02
18652               a 2017-01-13 14:51:59
18653               a 2016-12-12 22:30:01

type(u2.iloc[-104:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size())

pandas.core.series.Series

数据帧输出:

u2.iloc[-105:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size()
SCENARIO_STARTDATE  2016-12-31  2017-03-31
UPGRADESTRATEGY                           
a                            1           6
b                            1           1

系列输出:

u2.iloc[-104:-96].groupby(["UPGRADESTRATEGY"]).resample('Q', on='SCENARIO_STARTDATE').size()
UPGRADESTRATEGY  SCENARIO_STARTDATE
a                2016-12-31            1
                 2017-03-31            6
b                2017-03-31            1
dtype: int64

我没主意了!

标签: pandaspandas-groupby

解决方案


推荐阅读