如何在Pandas中移除每行列表内长字符串?代码错误排查
问题根源与解决方案
问题出在哪?
你当前的Student列存储的不是真正的Python列表对象,而是格式模仿列表的字符串(比如"[Adam, Kanye, Alice Stocks, Joseph Matthew]")。当你用for x in df['Student']遍历的时候,x是完整的字符串,内层的for y in x会把字符串拆成单个字符逐个遍历,而非按逗号分割的姓名遍历,所以代码才会在字符级别运行。
解决步骤
1. 先把字符串格式的"列表"转成真正的列表
可以用两种方式实现:
- 方式一(推荐,兼容性更强):用
ast.literal_eval解析字符串为列表
import pandas as pd import ast # 构造示例数据 df = pd.DataFrame({ 'Class': ['One', 'Two'], 'Student': ['[Adam, Kanye, Alice Stocks, Joseph Matthew]', '[Justin Bieber, Selena Gomez]'] }) # 转换字符串为列表 df['Student'] = df['Student'].apply(ast.literal_eval)
- 方式二:纯字符串处理(适合格式规范的场景)
df['Student'] = df['Student'].str.strip('[]').str.split(', ')
2. 筛选长度小于8的姓名
用apply结合列表推导式筛选:
df['Student'] = df['Student'].apply(lambda names: [name for name in names if len(name) < 8])
3. 格式化结果并过滤空行
把筛选后的列表转成逗号分隔的字符串,同时删除没有符合条件姓名的行:
df['Student'] = df['Student'].str.join(', ') df = df[df['Student'] != ''].reset_index(drop=True)
最终得到的结果就是你想要的:
| Class | Student |
|---|---|
| One | Adam, Kanye |
内容的提问来源于stack exchange,提问作者adamfrancis
相关产品推荐
相关产品推荐

