删除特定值第一次出现时下方的行

2024-09-29 18:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我们的目标是确定当cdcode中,每个唯一的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==2ID==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

有没有一种更简洁、有效和/或更具吸引力的方法来实现这一点?你知道吗


Tags: inidfalse目标dfforcdcode
1条回答
网友
1楼 · 发布于 2024-09-29 18:41:35

首先,确定每个组在“a”之后显示为u的行。然后,确定哪些行包含“c”和“d”,如v。使用mul,我们确定哪些行符合我们的标准,然后使用groupbyany得到一个掩码来消除它们。你知道吗

u = df['cd'].eq('a').groupby(df.ID).cumsum()
v = df['cd'].isin(['c', 'd'])

df[~u.mul(v).groupby(df.ID).transform('any')]

   ID               dates cd
0   1 2018-12-30 00:00:00  c
1   1 2018-12-30 01:00:00  b
2   1 2018-12-30 02:00:00  a

相关问题 更多 >

    热门问题