pandas从DataFrame列生成的列表长度为18而非预期6,如何解决?
问题原因分析
- 核心错误是使用了嵌套循环:df的
a列共有6个元素,cat列表共有3个元素,外层每遍历1个a列元素,内层都会遍历全部3个cat元素,每次遍历都会往cat_list追加1个值,最终总长度为6*3=18,和预期的6个元素不符。 - 原有逻辑每匹配到正确的
cat元素后没有终止内层循环,同时不匹配时直接追加0的逻辑也完全不符合需求。
修正后的代码
写法1:修改循环逻辑(匹配原始写法习惯)
import pandas as pd d = {'a': [0.1, 0.2,0.3,0.4,0.5,0.6], 'b': [0.6, 0.8,0.3,0.4,0.1,0.1], 'c': [0.7, 0.3,0.9,0.4,1.0,0.2],'d': [1,0,0,1,0,1]} df = pd.DataFrame(data=d) cat=[0.6,0.3,0.1] cat_list=[] for i in df.a: if i in cat: cat_list.append(cat.index(i)) else: cat_list.append(0) print(cat_list) # 输出 [2, 0, 1, 0, 0, 0] print(len(cat_list)) # 输出 6
写法2:pandas向量化写法(效率更高,适合大数据量场景)
# 先构建值到索引的映射字典,避免每次调用index方法遍历cat列表 cat_map = {v:idx for idx, v in enumerate(cat)} # 用map方法匹配,未匹配到的空值填充0后转列表 cat_list = df['a'].map(cat_map).fillna(0).astype(int).tolist()
内容的提问来源于stack exchange,提问作者john johns
相关产品推荐
相关产品推荐

