gpt4 book ai didi

python - 状态变化时记录差异 - Pandas

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:36 24 4
gpt4 key购买 nike

我有带有 ID、时间戳和状态的客户记录。

ID, TS, STATUS
1 10 GOOD
1 20 GOOD
1 25 BAD
1 30 BAD
1 50 BAD
1 600 GOOD
2 40 GOOD
.. ...

我正在尝试计算每个客户在连续 BAD 状态(假设上面的顺序是正确的)中花费的时间。因此,对于客户 id=1,30-25,50-30,600-50 总共 575 秒处于 BAD 状态。

在Pandas中这样做的方法是什么?如果我在 TS 上计算 .diff() ,那会给我带来差异,但我如何将 1) 与客户联系起来 2) 该客户的某些状态“ block ”?

示例数据:

df = pandas.DataFrame({'ID':[1,1,1,1,1,1,2],
'TS':[10,20,25,30,50,600,40],
'Status':['G','G','B','B','B','G','G']
},
columns=['ID','TS','Status'])

谢谢,

最佳答案

In [1]: df = DataFrame({'ID':[1,1,1,1,1,2,2],'TS':[10,20,25,30,50,10,40],'Stat
us':['G','G','B','B','B','B','B']}, columns=['ID','TS','Status'])

In [2]: f = lambda x: x.diff().sum()

In [3]: df['diff'] = df[df.Status=='B'].groupby('ID')['TS'].transform(f)

In [4]: df
Out[4]:
ID TS Status diff
0 1 10 G NaN
1 1 20 G NaN
2 1 25 B 25
3 1 30 B 25
4 1 50 B 25
5 2 10 B 30
6 2 40 B 30

解释:将 dataframe 子集为仅具有所需状态的那些记录。 Groupby ID 并将 lambda 函数 diff().sum() 应用于每个组。使用 transform 而不是 apply 因为 transform 返回一个索引系列,您可以使用它分配给新列“diff”。

编辑:对扩大问题范围的账户的新回应。

In [1]: df
Out[1]:
ID TS Status
0 1 10 G
1 1 20 G
2 1 25 B
3 1 30 B
4 1 50 B
5 1 600 G
6 2 40 G

In [2]: df['shift'] = -df['TS'].diff(-1)

In [3]: df['diff'] = df[df.Status=='B'].groupby('ID')['shift'].transform('sum')
In [4]: df
Out[4]:
ID TS Status shift diff
0 1 10 G 10 NaN
1 1 20 G 5 NaN
2 1 25 B 5 575
3 1 30 B 20 575
4 1 50 B 550 575
5 1 600 G -560 NaN
6 2 40 G NaN NaN

关于python - 状态变化时记录差异 - Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14199718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com