Сгруппировать и найти разницу

#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