从列表创建Dataframe异常:列表元素未按列排列问题求助
问题解决:将列表作为行追加到DataFrame
问题原因
直接用append()追加列表时,pandas会把列表里的每个元素当作单独的行(全部放在列0中),而不是把整个列表作为一行的多列值——因为append()默认将一维列表解析为行方向的元素序列,而非单行多列的数据。
解决方案
推荐两种高效且正确的实现方式:
方法1:先收集所有行再一次性构建DataFrame(最优)
循环时先把所有行数据存到一个大列表里,最后统一创建DataFrame,避免循环中重复修改DataFrame带来的性能损耗:
import pandas as pd rows = [] # 先收集所有行数据 for i in tmpList: rows.append(getTFSData(i)) # 指定列名(和你返回的列表元素顺序对应) columns = ['id', 'Title', 'state', 'IterationPath', 'Tags'] data = pd.DataFrame(rows, columns=columns)
方法2:将列表转为Series后追加(兼容旧写法)
如果必须用循环追加的方式,需要把列表转为Series,并让Series的索引匹配DataFrame的列名,同时加上ignore_index=True避免索引冲突:
import pandas as pd # 假设data已经初始化好且列名正确 for i in tmpList: row_series = pd.Series(getTFSData(i), index=data.columns) data = data.append(row_series, ignore_index=True)
注意:pandas 2.0及以上版本中
append()方法已被标记为废弃,更推荐用pd.concat()替代:
data = pd.concat([data, pd.DataFrame([getTFSData(i)], columns=data.columns)], ignore_index=True)
为什么原代码失效?
原代码中append(getTFSData(i))传入的是一维列表,pandas会将其解析为包含多个元素的序列,每个元素单独成为一行(列0的行),而非一行多列的结构。只有传入匹配列数的Series或DataFrame对象时,才能正确将列表映射为一行的多列值。
内容的提问来源于stack exchange,提问作者Roland
相关产品推荐
相关产品推荐

