Многочисленные манипуляции с датами на панде - PullRequest
1 голос
/ 04 ноября 2019

У меня есть фрейм данных, который мне нужно отфильтровать по датам. Например, образец моего набора данных приведен ниже:

df:

        id      date        time        promo   Wave    
1373662 2702    2019-10-20  10:11:58    7560    C   
1553376 2702    2019-10-20  10:11:58    8859    C   
49686   2274    2019-10-11  20:39:29    2976    A   
398860  2274    2019-10-11  20:39:29    5413    B   
506767  2987    2019-10-30  20:52:46    8533    C   
916306  2987    2019-10-30  20:52:46    9447    D   
1234493 2816    2019-10-14  13:12:50    6470    A   
1415534 2816    2019-10-14  13:12:50    5888    A   
381483  2334    2019-10-24  14:20:29    9318    D   
1217261 2334    2019-10-24  14:20:29    0573    F   

Все идентификаторы должны получать промо на основе волн (порядок AF). Я хочучтобы проверить, есть ли какие-либо идентификаторы в рекламных акциях в другом порядке. Например, получение волны F до A или волны B до A и так далее.

Я не могу найти запрос, который может это сделать. Я отсортировал набор данных по id, дате и времени. Тем не менее, поскольку существует более 2 млн. Строк, трудно проверить, где возникает расхождение.

df.sort_values(by=['id','date','time'],inplace=True]

Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Это вернет список id с, что это произойдет, при условии, что ваш df заказан, как вы упомянули.

ord преобразует символы в числа (wave_num), diff вычислит разницу между wave_num, а затем вам просто нужно увидетьдля которого id разница отрицательна

import pandas as pd
df = pd.DataFrame({'id':[1,1,2,2,2,4],
                   'wave':['C','A','A','B','C','A']})
df['wave_num'] = df['wave'].apply(lambda x: ord(x))
df['difference'] = df.groupby('id')['wave_num'].diff()
list(df.loc[(df.difference<0)]['id'].unique())
0 голосов
/ 04 ноября 2019

То, что вы можете сделать, это:

# once this is done
df.sort_values(by=['id','date','time'], inplace=True)

# create two columns
df["wave_ordered"] = df[["id", "Wave"]].groupby(["id"])["Wave"].transform(lambda x: ' '.join(x))
df["is_ordered"] = df["wave_ordered"].transform(lambda x: x.split() == sorted(x.split()))

В столбце is_ordered указывается, были ли у человека акции в «правильном» порядке или нет.

В порядкечтобы идентифицировать лиц, у которых есть расхождения, вам нужно только:

set(df[df["is_ordered"] == False]["id"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...