如何基于指定代码列表过滤含字符串形式列表列的DataFrame?
处理包含字符串格式数值列表的DataFrame过滤需求
解决步骤
- 解析字符串格式的列表:使用
ast.literal_eval将AISPREDOT列的字符串转为实际的Python列表,该方法能安全解析合法的字符串化数据结构。 - 过滤目标行:通过
apply结合any()函数,检查每行的列表是否包含codes中的至少一个元素,筛选出符合条件的行生成新DataFramedf2。
完整代码示例
import pandas as pd import ast # 示例输入:以INC_KEY为索引的df1 data = { 'AISPREDOT': [ "[110402.0, 123456.0]", "[789012.0, 854362.0]", "[345678.0, 987654.0]", "[110402.0, 854362.0]" ] } df1 = pd.DataFrame(data, index=['INC001', 'INC002', 'INC003', 'INC004']) # 1. 将字符串列表转为实际列表 df1['AISPREDOT'] = df1['AISPREDOT'].apply(ast.literal_eval) # 2. 定义目标代码列表并过滤 codes = [110402.0, 854362.0] df2 = df1[df1['AISPREDOT'].apply(lambda x: any(code in x for code in codes))] # 查看结果 print(df2)
示例输出
AISPREDOT INC001 [110402.0, 123456.0] INC002 [789012.0, 854362.0] INC004 [110402.0, 854362.0]
异常处理补充
如果AISPREDOT列存在格式不规范的字符串(比如多余空格、语法错误),可以添加安全解析函数避免崩溃:
def safe_parse_list(s): try: return ast.literal_eval(s) except (SyntaxError, ValueError): return [] df1['AISPREDOT'] = df1['AISPREDOT'].apply(safe_parse_list)
内容的提问来源于stack exchange,提问作者Sean Roudnitsky
相关产品推荐
相关产品推荐

