我有一个数据帧,需要按日期进行筛选。例如,我的数据集示例如下:
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"])