【问题标题】:Grouping by Pandas Series Values using Grouper in Python在 Python 中使用 Grouper 按 Pandas 系列值分组
【发布时间】: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


【解决方案1】:

不幸的是,我不知道在这种情况下如何直接使用pd.Grouper。您必须设置索引(正如您在问题中已经提到的那样),或者您必须从 Series 中创建一个 DataFrame。如果您不坚持使用 Grouper 对象,您还可以使用 .dt 访问器进行日期时间分组,如下所示:

data.groupby(data.dt.month).size()

或者你可以使用strftime(但是会慢一点)

data.groupby(data.dt.strftime("%Y-%m")).size()

这些是我能够提出的唯一可以直接使用您的系列的案例,但我知道这可能不是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2023-02-21
    • 2017-02-22
    • 2021-11-07
    • 2019-11-21
    相关资源
    最近更新 更多