#python-3.x #pandas #pandas-groupby
#python-3.x #панды #pandas-groupby
Вопрос:
У меня есть pandas 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
Я повторяю это, чтобы найти максимум. Это займет много времени, если я попробую это на огромном наборе данных. Любой другой обходной путь для достижения этой ожидаемой операции.
Комментарии:
1. итак, каков результат для 2222
2. @Wen-Ben diff => [-1]. Поскольку мне нужно только максимальное значение, я рассматриваю только абсолютное значение, поэтому значение op равно 1.
3. Так
diff
есть(month, day)
или простоmax(diff_month, diff_day)
? Ваш ожидаемый результат, похоже, говорит о втором, но в заявлении говорится о первом.
Ответ №1:
Это то, что вам нужно
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
Комментарии:
1. Именно то, что я искал. Спасибо
Ответ №2:
Это позволяет определить максимальную разницу между датами для данной группы.
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