在Pandas中向空DataFrame添加数据?

323

是否可以将数据添加到一个不包含任何索引或列的空数据框中?

我尝试过这样做,但最终得到的是一个空数据框。

例如:

import pandas as pd

df = pd.DataFrame()
data = ['some kind of data here' --> I have checked the type already, and it is a dataframe]
df.append(data)

结果看起来像这样:

Empty DataFrame
Columns: []
Index: []

1
在这里回答了一个类似的问题:https://dev59.com/WGYr5IYBdhLWcg3wTYgQ#41529411。 基本上像这样 newDF = pd.DataFrame() #创建一个新的空数据框 newDF = newDF.append(oldDF, ignore_index = True) #忽略索引是可选的 - geekidharsh
追加什么?单个值?Python列表?pandas Series?另一个数据帧?你的示例尾注表明你指的是另一个数据帧 - 所以在你的示例代码中给出一个数据帧 :) - smci
当你说“结果看起来像这样”时,我希望你不是试图直接执行print(df.append(data)),因为在Python中append()总是返回None。 - smci
为什么会出现“AttributeError: 'DataFrame' object has no attribute 'append'”错误? 从pandas 2.0开始,API中已经默默地删除了append函数,以防止人们在循环内部迭代增长DataFrame :D 在循环内使用append会导致二次方内存使用,因此建议的方法是在python列表中累积单个行或DataFrame,然后在最后将其转换为一个大的df。更多信息请参见我的答案 - cs95
6个回答

539

这应该可以工作:

>>> df = pd.DataFrame()
>>> data = pd.DataFrame({"A": range(3)})
>>> df = df.append(data) 
>>> df

   A
0  0
1  1
2  2

由于append不是原地发生的,所以如果您想要它,您必须存储输出:

>>> df = pd.DataFrame()
>>> data = pd.DataFrame({"A": range(3)})
>>> df.append(data)  # without storing
>>> df
Empty DataFrame
Columns: []
Index: []
>>> df = df.append(data)
>>> df
   A
0  0
1  1
2  2

15
谢谢!可以了!我没有意识到我需要存储输出...我可能应该更好地阅读文档,但是感谢@DSM! - ericmjl
17
我经常忘记你需要分配它! - Andy B
91
实际上,最重要的信息在于该操作并不是原地发生的。;) - refuzee
10
不知道为什么Pandas的示例没有展示这个。感谢您的帮助! - Drew Szurko
6
请注意,至少在2018年6月,如果您希望新的行自动索引,您应该编写df.append(data, ignore_index=True)。感谢完美的答案! - Adam B
显示剩余7条评论

135

如果你想要添加一行,可以使用字典:

df = pd.DataFrame()
df = df.append({'name': 'Zed', 'age': 9, 'height': 2}, ignore_index=True)

这将给您:

   age  height name
0    9       2  Zed

1
低性能,特别是在处理大数据时。 - raullalves
7
@raullalves,你能把这个与其他提议的选择联系起来吗? - Bouncner
2
"FutureWarning": "frame.append" 方法已被弃用,并将在未来版本中从 "pandas" 中删除。请改用 "pandas.concat"。 - Curious Watcher

47

您可以通过以下方式连接数据:

InfoDF = pd.DataFrame()
tempDF = pd.DataFrame(rows,columns=['id','min_date'])

InfoDF = pd.concat([InfoDF,tempDF])

谢谢,我试过了concat。但是如果它们可以完成相同的工作,为什么要同时使用append和concat呢? - Nitesh kumar
这个线程可能会给出一个很好的解释:https://dev59.com/OmUo5IYBdhLWcg3wtRbh - Deepish
2
什么是行/列?@Deepish - Subham

18

答案非常有用,但由于(正如各位用户已经提到的那样)pandas.DataFrame.append被弃用了,使用pandas.concat的答案不是“可运行代码片段”,因此我想添加以下代码片段:

import pandas as pd

df = pd.DataFrame(columns =['name','age'])
row_to_append = pd.DataFrame([{'name':"Alice", 'age':"25"},{'name':"Bob", 'age':"32"}])
df = pd.concat([df,row_to_append])

现在,df 是:

    name age
0  Alice  25
1    Bob  32

5

pandas.DataFrame.append自1.4.0版本起已弃用:请使用concat()代替。

因此:

df = pd.DataFrame() # empty dataframe
df2 = pd..DataFrame(...) # some dataframe with data

df = pd.concat([df, df2])

1
为什么会出现“AttributeError: 'DataFrame' object has no attribute 'append'”?
从pandas >= 2.0开始,已经移除了`append`方法,应该使用pd.concat代替。
将多个小的DataFrames收集到一个列表中,然后通过一次调用pd.concat的方式来连接它们是最常见的方法。
df_list = []
for df in some_function_that_yields_df():
    df_list.append(df)

big_df = pd.concat(df_list)

删除它的原因是为了阻止在循环中迭代增长DataFrame(这通常是人们使用append的方式)。这是因为每个阶段append都会创建一个新副本,导致内存复杂度呈二次增长。请参见创建一个空的Pandas DataFrame,然后填充它(特别是这个答案),其中的答案不鼓励迭代增长DataFrame。

更多信息:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接