【问题标题】:Pandas: using groupby and nunique taking time into account熊猫:考虑时间使用 groupby 和 nunique
【发布时间】:2020-05-08 04:31:44
【问题描述】:

我有一个这种形式的数据框:

A    B    time
1    2    2019-01-03
1    3    2018-04-05
1    4    2020-01-01
1    4    2020-02-02

其中 A 和 B 包含一些整数标识符。 我想测量每个 A 与之交互的不同标识符的数量。为此,我通常只需这样做

df.groupby('A')['B'].nunique()   

我现在必须做一件稍微不同的事情:每个标识符都有一个分配的日期(每个标识符都不同),它将其交互分成两部分:在该日期之前发生的那些,以及在该日期之后发生的那些。之前完成的相同操作(计算与 交互的唯一 B 的数量)需要分别为两个部分完成。

例如,如果 A=1 的日期是 2018-07-01,则输出为

A    before    after
1    1         2

在真实数据中,A 包含数百万个不同的标识符,每个标识符都有其唯一的日期。

已编辑 为了更清楚,我在 df.xml 中添加了一行。我想计算日期之前和之后每个 A 与之交互的 B 的不同值的数量

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    我会将A 转换为日期,将它们与df['time'] 进行比较,然后再与groupby().value_counts() 进行比较:

    (df['A'].map(date_dict)
        .gt(df['time'])
        .groupby(df['A'])
        .value_counts()
        .unstack()
        .rename({False:'after',True:'before'}, axis=1)
    )
    

    输出:

       after  before
    A               
    1      2       1
    

    【讨论】:

    • 我认为如果不同的标识符从 date_dict 共享相同的日期,这将不起作用,对吗?就我而言,这很可能会发生
    • 你试过了吗?它应该可以工作,因为我们使用groupby(df['A'])
    • ok 我刚试过,其实还有一个错误。在我的问题中,我要求像 nunique 这样的行为。取而代之的是值,我怀疑到日期的映射不会采用 B 的唯一值。我不是要求简单计数 A 在日期之前或之后出现的次数,而是它之前与之交互的不同唯一 B 的数量之后
    • 感谢您的提示,我自己解决了。我刚刚用你的地图和 gt 创建了一个新列,然后在 B 上使用 nunique 对 A 和新列进行分组。我自己会发布一个完整的答案
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 2015-11-05
    • 2021-06-16
    • 2013-10-24
    • 2013-06-06
    • 2019-01-18
    • 2020-09-08
    • 2023-02-24
    相关资源
    最近更新 更多