如何为Pandas Series中城市名添加_sub后缀(不影响区县名)?
Pandas Series 城市名批量加后缀问题
原始数据
你的Pandas Series内容如下:
London:Alpha London London:Beta London:Delta Paris
目标效果
要给每个城市名(注意不是区县名)末尾加_sub,最终得到:
London_sub:Alpha London_sub London_sub:Beta London_sub:Delta Paris_sub
你踩的坑
你试了两种方法,都没达到预期:
- 第一种链式操作:
names_df[0] = names_df[0] \ .str.split(':') \ .apply(lambda x: x[0] + '_sub') \ .str.join(':')
- 问题出在两处:一是
apply里只返回了改后的城市名,直接把区县部分丢了;二是str.join(':')是把字符串的每个字符用:拼接,所以才会出现L:o:n:d:o:n:_:s:u:b这种离谱结果。
- 第二种方法:
names_df[0] = names_df[0]\ .str.split(':')\ .apply(lambda x: '_sub:'.join(x))
- 问题是:当行里只有城市名(比如
London)时,拆分后是只有一个元素的列表,join用_sub:当分隔符的话,分隔符根本不会生效,自然加不上_sub。
正确做法
方法一:处理拆分后的列表
通过判断拆分后的列表长度,分别处理有区县和无区县的情况:
names_df[0] = names_df[0].str.split(':').apply(lambda x: f"{x[0]}_sub:{x[1]}" if len(x) > 1 else f"{x[0]}_sub")
方法二:正则替换(更简洁)
用正则匹配开头到第一个:(或整个字符串)的城市名部分,直接替换加后缀:
names_df[0] = names_df[0].str.replace(r'^([^:]+)', r'\1_sub', regex=True)
这个正则的逻辑是:^([^:]+)匹配字符串开头到第一个:之前的内容(如果没有:就匹配整个字符串),然后把匹配到的内容替换成原内容_sub,两种情况都能覆盖。
内容的提问来源于stack exchange,提问作者Daemon2017
相关产品推荐
相关产品推荐

