用多个单值替换多个值列表的优雅方式

elegant way to replace multiple list of values with a multiple single value

我有一个如下所示的数据框

df = pd.DataFrame()
df['text'] = ['p', 'S', 'primary','PRI','SECONDARY', 'SEC', 'S', 'TERTIARY','T','third']

我想替换如下所示的值列表

a) 将 PPRIMARYPRI 替换为 primary b) 将 SSECONDARYSEC 替换为 secondary c) 将 TTERTIARYTHIRD 替换为 third

我尝试了以下

df['text'] = df['text'].replace(['P','PRIMARY','PRI'],'primary')
df['text'] = df['text'].replace(['S','SECONDARY','SEC'],'secondary')
df['text'] = df['text'].replace(['T','TERTIARY','THIRD'],'tertiary')

但是有没有其他有效和优雅的方式在一行中写这个?

我希望我的输出如下所示

     text
0   primary
1   secondary
2   primary
3   primary
4   secondary
5   secondary
6   secondary
7   tertiary
8   tertiary
9   tertiary

避免多个 replace 的一个想法是使用 dictionary 并将其展平到另一个字典以获取列表值中的键,以便通过 Series.str.upper:[=15 匹配将列转换为大写=]

d = {'primary': ['P','PRIMARY','PRI'],
     'secondary':['S','SECONDARY','SEC'],
     'tertiary':['T','TERTIARY','THIRD']}


d1 = {x: k for k, v in d.items() for x in v}
df['text'] = df['text'].str.upper().replace(d1)
print (df)
        text
0    primary
1  secondary
2    primary
3    primary
4  secondary
5  secondary
6  secondary
7   tertiary
8   tertiary
9   tertiary