根据条件获取同一 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]
我有一个 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]