Python向空pd.DataFrame添加数据触发TypeError,求问题排查
问题解析:DataFrame添加行时出现TypeError的原因及解决办法
你在尝试往DataFrame里添加行数据并导出为CSV时碰到了TypeError: Expected tuple, got str的错误,明明参考了教程写法却跑不通,其实问题出在最开始创建DataFrame的列定义上。
核心错误点
你创建DataFrame时,列名用了嵌套列表的写法:
df = pd.DataFrame(columns=[ ['team'], ['timestamp'], ['tr_jan'], ['tr_dec'], ['tr_diff']])
这种写法会让pandas把列解析成多级索引(MultiIndex)——每个列名实际上是一个单元素的元组(比如('team',)),而不是你预期的普通字符串列名。
当你用df.append()传入字典时,字典的键是字符串(比如'team'),但DataFrame的列是元组类型的多级索引,两者无法匹配。pandas在尝试重新对齐列的时候,就会抛出TypeError: Expected tuple, got str的错误,因为它期望的是元组格式的列标识,而你给的是字符串。
解决办法
1. 修正列定义(最关键的一步)
把嵌套的列表改成普通的字符串列表,直接定义列名:
df = pd.DataFrame(columns=['team', 'timestamp', 'tr_jan', 'tr_dec', 'tr_diff'])
这样列就变成了普通的字符串索引,和你append时字典的键完全对应,就能正常添加行了。
2. 更高效的写法(推荐)
另外要注意,df.append()在pandas 2.0版本之后已经被弃用了,推荐先把所有行数据收集到列表里,再一次性创建DataFrame,这种方式性能更好,尤其数据量大的时候:
# 初始化空列表存储所有行数据 rows_data = [] for tuple_item in datapoints: team = tuple_item[0] for datapoint in tuple_item[1]: timestamp = get_time_stamp(datapoint[0]) # 将每行数据转为字典加入列表 rows_data.append({ 'team': team, 'timestamp': timestamp, 'tr_jan': 1, 'tr_dec': 20, 'tr_diff': 2000 }) # 一次性生成DataFrame df = pd.DataFrame(rows_data)
修改完成后,你就可以正常操作DataFrame,最后用df.to_csv('output.csv', index=False)导出成CSV文件了。
内容的提问来源于stack exchange,提问作者PEREZje
相关产品推荐
相关产品推荐

