【发布时间】:2021-01-22 22:21:46
【问题描述】:
我有一个带有时间戳的 Pandas 系列,我想按月分组并计数。如果这些数据在 DataFrame 中,我会使用这样的 Grouper:
data = pd.Series([pd.Timestamp("2020-01-01"), pd.Timestamp("2020-01-05"), pd.Timestamp("2020-02-05")])
data.name = "mydata"
data.to_frame().groupby(pd.Grouper(key=data.name, freq="MS")).size()
> mydata
> 2020-01-01 2
> 2020-02-01 1
> Freq: MS, dtype: int64
但是,如果我尝试直接在系列上执行 groupby,它会尝试按索引而不是系列中的值进行分组:
data.groupby(pd.Grouper(freq="MS")).size()
> TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'RangeIndex'
这个问题描述了如何按值分组:How to group a Series by values in pandas?,但我不明白该答案如何应用于使用 Grouper。尝试在 Grouper 中设置 key 似乎不起作用:
data.groupby(pd.Grouper(key=data, freq="MS")).size()
> ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
如果我将索引设置为系列中的值,则 grouper 起作用:
data.index = data
data.groupby(pd.Grouper(freq="MS")).size()
虽然这可行,但我怀疑有更好的方法来对 Pandas 系列中的值执行基于 Grouper 的 groupby 操作。关于如何执行此操作的任何想法?谢谢!
【问题讨论】:
-
你的数据必须是一个系列吗?
-
data = pd.Series(vals, index = vals)其中vals是时间戳列表,允许您基本上直接在构造函数中执行data.index=data。不确定那会更好。 -
这是个好主意,但不幸的是,Series 构造函数部分只是我为这篇文章制作的示例数据的一部分。我想在分组之前总是可以选择将 Series 转换为 DataFrame。但我希望直接在系列赛上进行分组,因为直觉上觉得它应该是可能的。如果不是 - 那么也许这就是 Pandas 团队的功能要求!
标签: pandas