Groupby并仅保留列表中包含值的组

2024-07-04 16:39:04 发布

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

你好,我有一个df,比如

list_vales_regex=['ABC',DEF']
Groups Names
G1 ABC_9
G1 ZTY_2
G1 SGG56
G1 BBCHU
G1 DEFE_8
G2 ABC_6
G2 GGDY
G3 ABC_6
G3 DEF98
G3 DEF89
G4 DEF_09
G4 DGE7
G5 DGGE22
G5 DGGE23

我只想保留同时包含(ABCDEF名称的组

在此示例中,仅保留了G1G3。 有人有主意吗


Tags: dfnamesdeflistregexgroupsabcg4
1条回答
网友
1楼 · 发布于 2024-07-04 16:39:04

首先通过列表将值获取到helper Series通过^{}|作为regex or的连接值,然后比较^{}中每个组转换为set的值:

list_vales_regex=['ABC','DEF']

s = df['Names'].str.extract(f'({"|".join(list_vales_regex)})', expand=False)
df = df[s.groupby(df['Groups']).transform(lambda x: set(x) >= set(list_vales_regex))]
print (df)
  Groups   Names
0     G1   ABC_9
1     G1   ZTY_2
2     G1   SGG56
3     G1   BBCHU
4     G1  DEFE_8
7     G3   ABC_6
8     G3   DEF98
9     G3   DEF89

或者使用^{}^{}过滤(如果不是大数据,因为速度较慢):

df = df[s.groupby(df['Groups']).transform('nunique').ge(2)]

另一种方法是通过^{}匹配至少一个值,然后通过L[0]根据列表的第一个值过滤组,并将其传递给^{}进行测试

list_vales_regex=['ABC','DEF']

L = [df.set_index('Groups')['Names'].str.contains(x).any(level=0) for x in list_vales_regex]

df = df[df['Groups'].isin(L[0].index[np.logical_and.reduce(L)])]
print (df)
  Groups   Names
0     G1   ABC_9
1     G1   ZTY_2
2     G1   SGG56
3     G1   BBCHU
4     G1  DEFE_8
7     G3   ABC_6
8     G3   DEF98
9     G3   DEF89

详细信息

print (np.logical_and.reduce(L))
[ True False  True False False]

print (L[0].index[np.logical_and.reduce(L)])
Index(['G1', 'G3'], dtype='object', name='Groups')

相关问题 更多 >

    热门问题