熊猫数据帧上的多个日期操作



我有一个数据帧,需要按日期进行筛选。例如,我的数据集示例如下:

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   

所有ID都应该获得基于Waves的促销(A-F订单(我想检查一下是否有身份证以不同的顺序获得了促销。例如,在A之前得到F波或在A之前获得B波,依此类推

我无法提出一个可以做到这一点的问题。我所做的是按id、日期和时间对数据集进行排序。然而,由于有2M行以上,因此很难检查差异发生在哪里。

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

感谢您的帮助!

这将返回发生这种情况的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())

您可以做的是:

# 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"])

最新更新