【问题标题】:Rolling count pandas for categorical variables using time使用时间滚动计数熊猫分类变量
【发布时间】:2020-09-14 02:10:56
【问题描述】:

我有一个如下所示的数据框:

Datetime   | Category | ID
--------------------------
2020-01-30 | A        | 1
2020-02-01 | B        | 1
2020-02-02 | A        | 1
2020-02-20 | A        | 1
2020-01-28 | B        | 2
2020-01-29 | C        | 2
2020-01-30 | C        | 2
2020-01-31 | D        | 2
2020-02-01 | D        | 2
2020-02-02 | D        | 2
2020-02-03 | C        | 2

我想在该行的 1 周窗口内(不包括当前行)获取每个 ID 的前 2 个最常见的类别。熊猫有可能吗?我试图做 .rolling 和 .value_counts 但它似乎不起作用。谢谢!

下面是我想得到的数据框:

Datetime   | Category | ID
--------------------------
2020-01-30 | NaN      | 1
2020-02-01 | [A, ""]  | 1
2020-02-02 | [A, B]   | 1
2020-02-20 | NaN      | 1
2020-01-28 | Nan      | 2
2020-01-29 | [B,""]   | 2
2020-01-30 | [B,C]    | 2
2020-01-31 | [B,C]    | 2
2020-02-01 | [C,D]    | 2
2020-02-02 | [C,D]    | 2
2020-02-03 | [C,D]    | 2

谢谢!

编辑 pd.get_dummies 答案很好,但由于我的数据集很大,效率不高。如果有人对此有有效的解决方案,将不胜感激!谢谢!

【问题讨论】:

    标签: python pandas rolling-computation


    【解决方案1】:

    您可以使用resample() 而不是rolling(),因为您的时间索引频率是每天,并且您想要每周统计信息,因此请尝试以下操作:

    df.groupby('ID').resample('1w').apply(lambda s: s.value_counts().head(2))
    

    请注意,这只适用于 apply() 将数据剥离到 pd.Series 而不是 np.arrays 的 Pandas 版本。此外,如果您的数据框中有更多列,则可能需要在 lambda 函数中指定列名,即:

    df.groupby('ID').resample('1w').apply(lambda s: s['Category'].value_counts().head(2))
    

    如果您需要排除窗口中的第一行,请使用iloc[] 切片:

    df.groupby('ID').resample('1w').apply(lambda s: s['Category'].iloc[1:].value_counts().head(2))
    

    【讨论】:

    • 非常感谢!但是由于我的某些数据实际上是我的频率不一致(例如 ID 1 可能有相隔超过 2 周的数据行),所以在这种情况下我将无法使用 shift 对吗?
    • 无论索引中的不一致如何,Shift 都会起作用 - 它只会将所有行移动 1。但是,如果您有如此大的差距,可能会导致结果出现一些问题。
    • 好吧,也许shift 是个坏主意。我做出了改变。
    • 感谢您的澄清!试图实现这一点,但我得到了错误: AttributeError: 'DatetimeIndexResamplerGroupby' object has no attribute 'value_counts' when I try to do the .apply
    • 您安装了哪个版本的 Pandas?我的是1.0.3。您必须在 apply() 中升级到支持系列的版本。我在答案中写了。
    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2014-09-26
    • 2017-06-07
    • 2015-01-29
    • 2022-01-16
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多