gpt4 book ai didi

python - 删除特定值首次出现下方的行

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:57 24 4
gpt4 key购买 nike

目标是根据唯一的 ID 确定 code 中的 cd 何时出现在 a,然后对数据帧进行子集化(对 groupby 进行子集化也同样好)以不包含这些 ID

示例 df:

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')

使用此数据集,应从 df 中删除 ID==2ID==3:

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

是否有更简洁、高效和/或Pythonic的方法来实现这一点?

最佳答案

首先,确定每组“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

关于python - 删除特定值首次出现下方的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com