Группай и найди разницу - PullRequest
       4

Группай и найди разницу

0 голосов
/ 23 апреля 2019

У меня есть панда DF:

df = pd.DataFrame(np.random.randint(1,10,size=(6,2)),columns = list("AB"))
df["A"] = ["1111","2222","1111","1111","2222","1111"]
df["B"] = ["2001-01-10","2001-01-02","2001-02-11","2001-03-14","2001-02-01","2001-04-14"]
df

OP:

     A         B
0   1111    2001-01-10
1   2222    2001-01-02
2   1111    2001-02-11
3   1111    2001-03-14
4   2222    2001-02-01
5   1111    2001-04-14

Я пытаюсь создать новый столбец ->

max(difference in (month,day) of transaction for every user)

Например, для пользователя "1111" разные (месяц, день) транзакции:

[('01','10'),('02','11'),('03','14'),('04','14')]

и разница составляет

[1,3,0] => max(diff) = 3

потому что первая транзакция - 10 января, а следующая - 11 февраля (11 - 10 => 1), а затем 2 транзакции - 14 марта и апреля (14 -11 => 3) и (14- 14 => 0).

Ожидаемый ОП:

 A    Max_diff
1111   3

Код:

df.groupby("A",as_index=False).apply(lambda x: list(map(lambda d: (d.split("-")[1],d.split("-")[2]),x["B"])))

OP:

0    [(01, 01), (02, 02), (03, 03), (04, 03)]
1                        [(01, 02), (02, 01)]
dtype: object

Я повторяю это, чтобы найти макс. Это займет много времени, если я попробую это на огромном наборе данных. Любой другой обходной путь для достижения этого ожидаемого ОП.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Находит максимальную разницу между датами для данной группы.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(1,10,size=(6,2)),columns = list("AB"))
df["A"] = ["1111","2222","1111","1111","2222","1111"]
df["B"] = ["2001-01-10","2001-01-02","2001-02-11","2001-03-14","2001-02-01","2001-04-14"]

df["B"] = pd.to_datetime(df["B"])

def myfunc(x):
    #x.sort_values(by=['B'])
    x["Trans Diff Days"] = x["B"].diff()
    return x["Trans Diff Days"]

new_series = df.groupby("A").apply(myfunc)
print(new_series.groupby("A").max())

Выходные данные

A
1111   32 days
2222   30 days

1 голос
/ 23 апреля 2019

Это то, что вам нужно

df.B.dt.day.groupby(df.A).diff().groupby(df.A).max()
Out[177]: 
A
1111    3.0
2222   -1.0
Name: B, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...