解决Pandas混合类型列问题:确保watchedSegments始终为list类型
解决Pandas中
watchedSegments列混合字符串与列表类型的问题 要确保watchedSegments列全为<class 'list'>类型,可通过解析字符串格式的列表为实际列表对象实现,具体步骤如下:
1. 导入依赖库
使用ast.literal_eval安全解析字符串形式的Python数据结构:
import ast import pandas as pd
2. 定义转换函数
编写函数处理每个元素:字符串类型解析为列表,已为列表的直接保留,其他类型统一转为空列表(可按需调整):
def convert_to_list(value): if isinstance(value, str): try: return ast.literal_eval(value) except (SyntaxError, ValueError): return [] elif isinstance(value, list): return value else: return []
3. 应用转换到目标列
将函数应用到watchedSegments列,覆盖原列:
views_tmp['watchedSegments'] = views_tmp['watchedSegments'].apply(convert_to_list)
4. 验证转换结果
检查列中元素类型:
print(views_tmp['watchedSegments'].apply(type).tail())
预期输出全为<class 'list'>:
4411 <class 'list'> 4412 <class 'list'> 4413 <class 'list'> 4414 <class 'list'> 4415 <class 'list'>
5. 正常使用explode方法
此时调用explode可正确展开所有行:
print(views_tmp.tail().explode('watchedSegments'))
输出结果:
id watchedSegments 4411 12559466 {'start': 0, 'end': 17.04} 4412 12559947 {'end': 2645.39, 'start': 0} 4413 12560180 {'end': 1062.17, 'start': 0} 4414 12560397 {'start': 0, 'end': 1.42} 4415 12560861 {'start': 0, 'end': 1242.95}
关键说明
ast.literal_eval比eval更安全,仅解析合法Python字面量(列表、字典等),避免执行恶意代码。- 异常处理可防止因字符串格式错误导致程序中断,返回值可根据业务需求调整。
内容的提问来源于stack exchange,提问作者Btibert3
相关产品推荐
相关产品推荐

