【问题标题】:obtain difference between two values of same colum in same pandas dataframe based on conditions根据条件获取同一熊猫数据框中同一列的两个值之间的差异
【发布时间】:2016-07-22 05:04:17
【问题描述】:

我有一个格式为 df1 的熊猫数据框:

df1.head()

  action id     ts
0   A   3   2016-01-28 06:14:08.249000
1   B   3   2016-01-28 07:08:49.901000
2   A   4   2016-01-28 10:42:27.228000
3   B   4   2016-01-29 04:15:33.724000
4   B   4   2016-01-29 04:20:33.724000
5   A   5   2016-01-28 11:12:51.892000

列的数据类型: (action: string, id: int,ts: Series(使用 pandas.to_datetime() 将其从字符串转换))

我想要的是,同一数据帧/另一个系列中的新列,该列在相同 ID 的操作“A”和操作“B”之间存在时间差。唯一的事情是,我需要在min(ts) 中为每个 id 第一次出现动作“A”,然后是减去的值,因为动作“B”必须在动作“B”之后发生,我需要确定第一次出现之间的延迟动作'A'和动作'B'

我可以使用groupby()merge()unstack() 获得它,但我无法在其中获得min(ts)

提前致谢。

【问题讨论】:

    标签: python pandas dataframe min


    【解决方案1】:

    实现这一目标的一种方法是:

    In [87]: df
    Out[87]:
      action  id                      ts
    0      B   3 2016-01-28 06:14:08.249
    1      A   3 2016-01-28 07:08:49.901
    2      A   4 2016-01-28 10:42:27.228
    3      B   4 2016-01-29 04:15:33.724
    4      B   4 2016-01-29 04:20:33.724
    5      B   5 2016-01-28 11:12:51.892
    
    In [88]: grp = df.groupby(['id'])
    
    In [89]: grp.apply(lambda x: x[x['action'] == 'B'].ts.max()) - \
       ....: grp.apply(lambda x: x[x['action'] == 'A'].ts.min())
    Out[89]:
    id
    3   -1 days +23:05:18.348000
    4            17:38:06.496000
    5                        NaT
    dtype: timedelta64[ns]
    

    注意:请注意您的样本数据集 - 操作 B for id 3 发生在操作 A 之前

    如果要消除 NaT,可以使用.dropna()

    In [82]: result = (grp.apply(lambda x: x[x['action'] == 'B'].ts.max()) - \
       ....:           grp.apply(lambda x: x[x['action'] == 'A'].ts.min())).dropna()
    
    In [83]: result
    Out[83]:
    id
    3   -1 days +23:05:18.348000
    4            17:38:06.496000
    dtype: timedelta64[ns]
    

    【讨论】:

    • 非常感谢。我不知道如何正确使用lambda。我还有一个问题,如何从这个输出系列中消除具有Nat 的行?
    • @ParisaRai,很高兴我能帮上忙。我用“消除 NaT”更新了我的答案
    猜你喜欢
    • 2016-08-03
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2021-11-15
    • 2019-11-18
    相关资源
    最近更新 更多