如何在Pandas拆分字符串列表值时保留含逗号的特定值?
解决DataFrame中特定含逗号字符串不拆分的问题
问题场景
需要将原始DataFrame的「Select activity」列拆分后转为新行,但其中Nothing, just walking这个含逗号的字符串需保持完整,不能被拆分。原始DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'Name': ['Ann', 'Mark', 'John'], 'Age': [25, 30, 41], 'Select activity': ['Cycling, Running', 'Nothing, just walking', 'Cycling, Running, Swimming'], 'Profession': ['Saleswoman', 'Manager', 'Accountant'] })
之前使用的代码会错误拆分Nothing, just walking:
df_new = df.loc[:, ['Name', 'Age']] df_new['Activity'] = df['Select activity'].str.split(', ') df_new = df_new.explode('Activity').reset_index(drop=True)
得到的错误结果:
Name Age Activity 0 Ann 25 Cycling 1 Ann 25 Running 2 Mark 30 Nothing 3 Mark 30 just walking 4 John 41 Cycling 5 John 41 Running 6 John 41 Swimming
添加的if df['Select activity'].isin(['Nothing, just walking']) is False:语句报错,因为isin返回的是布尔Series,不能直接用is False判断整个Series的真假。
可行解决方案
方法1:临时替换特殊字符串的分隔符
先把Nothing, just walking里的逗号替换成临时标记,拆分后再替换回来:
# 先替换特殊字符串里的逗号为临时分隔符 temp_col = df['Select activity'].replace('Nothing, just walking', 'Nothing|just walking', regex=False) # 按逗号+空格拆分 df_new = df.loc[:, ['Name', 'Age']].assign(Activity=temp_col.str.split(', ')) # 拆分后把临时分隔符换回逗号 df_new['Activity'] = df_new['Activity'].apply(lambda x: [s.replace('|', ', ') for s in x]) # 展开成行 df_new = df_new.explode('Activity').reset_index(drop=True)
运行后得到正确结果:
Name Age Activity 0 Ann 25 Cycling 1 Ann 25 Running 2 Mark 30 Nothing, just walking 3 John 41 Cycling 4 John 41 Running 5 John 41 Swimming
方法2:使用正则表达式精准拆分
利用正则的负向断言,只拆分不在Nothing后面的逗号+空格:
# 正则匹配:匹配逗号+空格,但前面不是"Nothing" df_new = df.loc[:, ['Name', 'Age']].assign(Activity=df['Select activity'].str.split(r'(?<!Nothing), ')) df_new = df_new.explode('Activity').reset_index(drop=True)
这个方法更简洁,直接通过正则避免拆分目标字符串里的逗号。
方法3:自定义apply函数处理
逐行判断字符串,遇到目标字符串就不拆分,其他正常拆分:
def split_activity(s): if s == 'Nothing, just walking': return [s] else: return s.split(', ') df_new = df.loc[:, ['Name', 'Age']].assign(Activity=df['Select activity'].apply(split_activity)) df_new = df_new.explode('Activity').reset_index(drop=True)
这种方法逻辑直观,适合需要处理多个特殊字符串的场景。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

