我们的目标是确定当c
和d
在code
中,每个唯一的ID
发生在a
之后,然后对数据帧进行子集(对groupby进行子集设置同样好)以不包括这些ID
样品测向:
df = pd.DataFrame({'ID':np.repeat([1,2,3],[3,4,3]), 'dates' : [(pd.Timestamp('2018-12-30 00:00:00') + pd.Timedelta(hr, unit = 'h')) for hr in range(10)], 'cd': ['c','b','a','b','c','a','c','b','a','d']})
grouped = df.groupby('ID', as_index = False).apply(lambda x: x.sort_values('dates', ascending = False))
grouped = grouped.groupby('ID')
有了这个数据集,ID==2
和ID==3
应该从df中删除:
for key, item in grouped:
print(grouped.get_group(key), "\n\n")
输出:
ID dates cd
0 2 1 2018-12-30 02:00:00 a
1 1 2018-12-30 01:00:00 b
0 1 2018-12-30 00:00:00 c
ID dates cd
1 6 2 2018-12-30 06:00:00 c
5 2 2018-12-30 05:00:00 a
4 2 2018-12-30 04:00:00 c
3 2 2018-12-30 03:00:00 b
ID dates cd
2 9 3 2018-12-30 09:00:00 d
8 3 2018-12-30 08:00:00 a
7 3 2018-12-30 07:00:00 b
我认为下面的方法可以实现这个目标,即为每个组创建一个字符串,然后使用str.find()
来确定优先级:
for i,r in grouped:
cdSeq = ''
for code in r['cd']:
cdSeq+=code
if abs(cdSeq.find('c')) < abs(cdSeq.find('a')) or abs(cdSeq.find('d'))<abs(cdSeq.find('a')):
df = df[df['ID']!=i]
df.groupby('ID', as_index = False).apply(lambda x: x.sort_values('dates', ascending = False))
输出:
ID dates cd
0 2 1 2018-12-30 02:00:00 a
1 1 2018-12-30 01:00:00 b
0 1 2018-12-30 00:00:00 c
有没有一种更简洁、有效和/或更具吸引力的方法来实现这一点?你知道吗
首先,确定每个组在“a”之后显示为
u
的行。然后,确定哪些行包含“c”和“d”,如v
。使用mul
,我们确定哪些行符合我们的标准,然后使用groupby
和any
得到一个掩码来消除它们。你知道吗相关问题 更多 >
编程相关推荐