332

Is it possible to append to an empty data frame that doesn't contain any indices or columns?

I have tried to do this, but keep getting an empty dataframe at the end.

e.g.

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)

The result looks like this:

Empty DataFrame
Columns: []
Index: []
4
  • 1
    Answered a similar question here: stackoverflow.com/questions/13784192/…. basically something like this newDF = pd.DataFrame() #creates a new dataframe that's empty newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional Commented Feb 24, 2017 at 5:31
  • Append what? A single value? a Python list? a pandas Series? Another Dataframe? Your example trailing comment suggests you mean another dataframe - so give a dataframe in your example code, already :) Commented Aug 4, 2019 at 13:46
  • And when you say "The result looks like this", I hope you're not trying to directly do print(df.append(data)), because append() always returns None in Python Commented Aug 4, 2019 at 13:50
  • "Why am I getting "AttributeError: 'DataFrame' object has no attribute 'append'?" From pandas 2.0, append was silently removed from the API to discourage people from iteratively growing DataFrames inside a loop :D append inside a loop is quadratic memory usage, so the suggested approach is to accumulate individual rows or DataFrames inside a python list and then convert it into one big df at the end. More information in my answer Commented Apr 19, 2023 at 8:18

6 Answers 6

547

This should work:

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

   A
0  0
1  1
2  2

Since the append doesn't happen in-place, so you'll have to store the output if you want it:

>>> 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
Sign up to request clarification or add additional context in comments.

5 Comments

note that at least in june 2018 if you'd like the new rows to auto-index themselves, you should write df.append(data, ignore_index=True). Thanks for the great answer!
To append in-place, check this answer
Is there an easy way to know what operations are in place, and which aren't? In Python "everything is an object", so you'd think .append would be directly on the object and thus in place.
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
AttributeError: 'DataFrame' object has no attribute 'append'
135

And if you want to add a row, you can use a dictionary:

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

which gives you:

   age  height name
0    9       2  Zed

3 Comments

Low performace, specially when dealing with large data
Can you put that in relation to the other proposed alternatives, @raullalves?
FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
50

You can concat the data in this way:

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

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

3 Comments

Thank you, I tried the concat. But why both append and concat if they can do the same job
This thread might give a good explanation : stackoverflow.com/questions/15819050/…
What are rows/columns? @Deepish
27

The answers are very useful, but since pandas.DataFrame.append was deprecated (as already mentioned by various users), and the answers using pandas.concat are not "Runnable Code Snippets" I would like to add the following snippet:

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])

So df is now:

    name age
0  Alice  25
1    Bob  32

Comments

8

pandas.DataFrame.append Deprecated since version 1.4.0: Use concat() instead.

Therefore:

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

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

Comments

2

Why am I getting "AttributeError: 'DataFrame' object has no attribute 'append'?

Starting from pandas >= 2.0, append has been removed, use pd.concat instead.

The idiomatic way to append DataFrames (it to collect all your smaller DataFrames into a list, and then make one single call to pd.concat.

df_list = []
for df in some_function_that_yields_df():
    df_list.append(df)

big_df = pd.concat(df_list)

The rationale for its removal was to discourage iteratively growing DataFrames in a loop (which is what people typically use append for). This is because append makes a new copy at each stage, resulting in quadratic complexity in memory. See Creating an empty Pandas DataFrame, and then filling it (in particular, this answer) where answers discourage iteratively growing DataFrames.

More info:

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.