根据条件获取同一 pandas 数据框中同一列的两个值之间的差异

obtain difference between two values of same colum in same pandas dataframe based on conditions

我有一个 pandas 格式的数据帧 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' 之间具有时间差。唯一的事情是,我需要第一次出现动作 'A',如每个 ID 中的 min(ts),然后是减去的值,因为动作 'B' 必须在动作 'B' I 之后发生需要确定第一次出现动作 'A' 和动作 'B'

之间的延迟

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

提前致谢。

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

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]

注意:请注意您的样本数据集 - id 3 的操作 B 发生在操作 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]