向DataFrame追加列表行为异常:为何添加两行而非一行?
解决Pandas追加列表时变成两行而非一行的问题
我完全懂你现在的困扰——本来想把[Timestamp('2018-01-01 00:00:00', freq='D'), 0]这样的列表作为一行两列的数据追加到已有两列的DataFrame里,结果执行df_final.append(pd.DataFrame(temp_arr), ignore_index=True)后,居然变成了两行单列,这确实不符合预期。
为什么会出现这个问题?
当你直接把temp_arr传入pd.DataFrame()时,Pandas会默认把这个列表里的每个元素当成单独的一行数据,而不是同一行里的两个列值。所以列表里的时间戳会成为第一行,数值0成为第二行,自然就出现了你看到的结果。
正确的解决方法
这里给你几种靠谱的实现方式,按需选择:
方法1:给列表套一层外层列表(最简单快捷)
把temp_arr放到一个更大的列表里,告诉Pandas“这是一行数据,里面的两个元素是列值”:
df_final = df_final.append(pd.DataFrame([temp_arr]), ignore_index=True)
方法2:用字典指定列名(可读性更强)
如果你的DataFrame有明确的列名(比如date和value),用字典构造单行DataFrame会更清晰,也不容易出错:
# 假设df_final的列名是['date', 'value'] new_row = pd.DataFrame({ 'date': [temp_arr[0]], 'value': [temp_arr[1]] }) df_final = df_final.append(new_row, ignore_index=True)
方法3:用pd.concat()替代append()(官方推荐)
从Pandas 1.4.0版本开始,append()方法已经被标记为过时(deprecated),官方推荐使用pd.concat()来实现追加操作,写法如下:
# 对应方法1的concat版本 df_final = pd.concat([df_final, pd.DataFrame([temp_arr])], ignore_index=True) # 对应方法2的concat版本 new_row = pd.DataFrame({ 'date': [temp_arr[0]], 'value': [temp_arr[1]] }) df_final = pd.concat([df_final, new_row], ignore_index=True)
验证示例
我们来跑一个完整的例子确认效果:
import pandas as pd from pandas import Timestamp # 初始化空的两列DataFrame df_final = pd.DataFrame(columns=['date', 'value']) # 待追加的列表 temp_arr = [Timestamp('2018-01-01 00:00:00', freq='D'), 0] # 用方法1追加 df_final = df_final.append(pd.DataFrame([temp_arr]), ignore_index=True) print(df_final.head())
执行后输出的结果就是你预期的一行两列:
date value 0 2018-01-01 0
内容的提问来源于stack exchange,提问作者Derek Krantz
相关产品推荐
相关产品推荐

