首页 > 解决方案 > 熊猫从另一列事务的标准偏差为零的列返回值

问题描述

我对 pandas 比较陌生。我正在尝试返回单位列中标准偏差为“0”或每个后续交易之间的时间差小于 10 分钟的行或客户 ID。例如在事务1、4、5下面的数据中是50个单位,标准差为'0',同样事务3和6的时间差为1秒,6和7的时间差为3秒,所以第1、4、5行,应该返回 3,6,7。请帮我解决我被卡住的问题。数据如表所示:

索引| 客户ID| 代码 | 交易ID| 单位 | 邮票
1 |968794 |200 |46408 | 50 | 2019.06.28 00:03:22
2 |874213 |201 |6526 | 25 | 2019.06.28 00:03:20
3 |226292 |202 |18609 | 55 | 2019.06.28 00:03:22
4 |968794 |203 |50466 | 50 | 2019.06.28 00:03:26
5 |968794 |204 |65687 | 50 | 2019.06.28 00:03:33
6 |226292 |205 |232 | 23 | 2019.06.28 00:03:23
7 |226292 |206 |1232 | 45 | 2019.06.28 00:03:26
8 |874213 |207 |3343 | 32 | 2019.06.28 00:23:45
9 |874213 |208 |2343 | 54 | 2019.06.28 00:45:55

我已经尝试过这段代码,但不知道该往哪里走。对于我的情况,代码应该返回客户 ID 为 8968794 和 8226292 的行。这是我尝试过的,但不知道如何从时间部分开始。

df1= df.loc[(df['units'].groupby(df['customerid']).std()==0)]

这给了我错误: IndexingError: Unalignable boolean Series provided as indexer (boolean Series 和 indexed object 的索引不匹配

Suraj先生回答后,我尝试使用代码

df['TimeDiff'] = df.groupby('customerid')['tstamp'].transform(lambda g: (g.max()-g.min()).seconds)
df2 = df[df['TimeDiff']<600]
df3 = pd.concat([df1,df2]).drop_duplicates()

df3 变成:

 |时差 | 代码 | 客户 ID |索引 | 时间| 邮票 | 单位
0 南 |200| 8968794| 1 | 46408 | 2019-06-28 00:03:22 50
3 南 |203| 8968794| 4 | 50466 | 2019-06-28 00:03:26 50
4 南 |204| 8968794| 5 | 65687 | 2019-06-28 00:03:33 50
0 11.0|200| 8968794| 1 | 46408 | 2019-06-28 00:03:22 50
2 4.0 |202| 8226292| 3 | 18609 | 2019-06-28 00:03:22 55
3 11.0|203| 8968794| 4 | 50466 | 2019-06-28 00:03:26 50
4 11.0|204| 8968794| 5 | 65687 | 2019-06-28 00:03:33 50
5 4.0 |205| 8226292| 6 | 232 | 2019-06-28 00:03:23 23
6 4.0 |206| 8226292| 7 | 第1232章 2019-06-28 00:03:26 45

标签: python-3.xpandas

解决方案


当您 groupby 并直接执行 std 时,结果只是唯一 customerid 的大小(因为那是 groupby 指标)并且 loc 给出了错误。您需要的是转换函数,它为每个相应的行执行此操作。

df1= df.loc[(df['units'].groupby(df['customerid']).transform('std')==0)]

对于问题的第二部分,获取交易差异小于 10 分钟的客户 ID,

df['TimeDiff'] = df.groupby('customerid')['tstamp'].transform(lambda g: (g.max()-g.min()).seconds)
df2 = df[df['TimeDiff']<600]
df3 = pd.concat([df1,df2]).drop_duplicates()

df3 应该是您想要的结果


推荐阅读