如何在含多元素条目的DataFrame中迭代生成对应列表?
解决方法
核心问题是你的DataFrame单元格里存的是字符串,不是真正的列表/数值数组,所以直接调用tolist()会报错(字符串没有这个方法)。需要先把字符串解析成对应类型的列表,处理空值和单个值的情况。
步骤1:编写解析函数
分别处理文本列(Att1)和数值列(Att2):
- Att1:去掉引号、分割元素,遇到"NA"返回空列表
- Att2:分割字符串后转成float,单个值也处理成单元素列表
import pandas as pd def parse_att1(s): if s.strip() == "NA": return [] # 清理引号和空格后分割元素 items = [item.strip().strip('"') for item in s.split(',')] return [item for item in items if item] def parse_att2(s): # 分割后转成浮点数值列表 return [float(item.strip()) for item in s.split(',')]
步骤2:应用函数处理数据
方式一:批量整列处理(更高效)
直接用apply批量解析整列,生成对应列表列:
data = [['"tom-15", "to-13"', '10, 3.3'], ['"nick-12"', '15.5'], ['NA', '14']] df = pd.DataFrame(data, columns=['Att1', 'Att2']) # 批量生成列表列 df['Att1_list'] = df['Att1'].apply(parse_att1) df['Att2_list'] = df['Att2'].apply(parse_att2) # 查看结果 print(df[['Att1_list', 'Att2_list']])
输出结果:
Att1_list Att2_list 0 [tom-15, to-13] [10.0, 3.3] 1 [nick-12] [15.5] 2 [] [14.0]
方式二:逐行迭代处理(匹配你原有的iterrows需求)
如果必须用iterrows逐行处理,循环内调用解析函数即可:
for idx, row in df.iterrows(): l1 = parse_att1(row['Att1']) l2 = parse_att2(row['Att2']) # 此处写入你的后续业务逻辑 print(f"第{idx}行: l1={l1}, l2={l2}")
输出:
第0行: l1=['tom-15', 'to-13'], l2=[10.0, 3.3] 第1行: l1=['nick-12'], l2=[15.5] 第2行: l1=[], l2=[14.0]
关键说明
- 原报错原因:
row['Att1']取到的是字符串对象,而tolist()是pandas Series或numpy数组的专属方法,字符串没有这个属性。 - 解析函数已覆盖边界场景:单个值、空值(NA)、分割后残留的空格和引号。
内容的提问来源于stack exchange,提问作者Na_Na_Na
相关产品推荐
相关产品推荐

