панды, возвращающие значения из столбца с нулевым стандартным отклонением другой транзакции столбца - PullRequest
0 голосов
/ 06 ноября 2019

Я относительно новичок в pandas. Я пытаюсь вернуть строки или идентификаторы клиентов, которые либо имеют стандартное отклонение «0» в столбце единиц, либо разница во времени между каждой последующей транзакцией составляет менее 10 минут. например, в данных ниже транзакция 1,4,5 составляет 50 единиц, и стандартное отклонение будет равно 0, аналогично транзакция 3 и 6 имеет разницу во времени в 1 секунду, а 6 и 7 имеют разницу в 3 секунды, поэтому строки 1,4,5,3,6,7 должны быть возвращены. Пожалуйста, помогите мне с этим, я застрял. Данные показаны в таблице:

<em>index|  customerid|  code |   transactionID|  units |  tstamp
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
</em>

Я пробовал этот код, но не знаю, куда идти дальше. для моего случая здесь код должен вернуть мне строки с идентификаторами клиентов 8968794 и 8226292. Вот что я пробовал, но не знаю, как даже начать с части времени.

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

, это дает мне ошибку:IndexingError: в качестве индексатора предоставлена ​​недопустимая логическая серия (индексы логической серии и индексированного объекта не совпадают

После ответа г-на Сураджа я попытался использовать код

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приходит к:

 <em>|TimeDiff  | code  |  customerid  |index |  tid| tstamp | units
0   NaN |200| 8968794| 1 |  46408 |  2019-06-28 00:03:22 50
3   NaN |203| 8968794| 4 |  50466 |  2019-06-28 00:03:26 50
4   NaN |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</em>

1 Ответ

0 голосов
/ 06 ноября 2019

Когда вы группируете и выполняете std напрямую, результатом будет только размер уникального customerid (так как это показатель groupby), а loc выдает ошибку. Что вам нужно, это функция преобразования, которая делает это для каждой соответствующей строки.

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

Для второй части вопроса, чтобы получить идентификатор клиента, где разница транзакций меньше 10 минут,

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 должен быть желаемым результатом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...