Append list to pandas DataFrame as new row with index

22,366

Either assign in-place with loc:

df.loc['two'] = [4, 5, 6]
# df.loc['two', :] = [4, 5, 6]
df
     A  B  C
one  1  2  3
two  4  5  6

Or, use df.append with the second argument being a Series object having appropriate index and name:

s = pd.Series(dict(zip(df.columns, [4, 5, 6])).rename('two'))
df2 = df.append(s)

df2
     A  B  C
one  1  2  3
two  4  5  6

If you are appending to a DataFrame without an index (i.e., having a numeric index), you can use loc after finding the max of the index and incrementing by 1:

df4 = pd.DataFrame(np.array([1,2,3]).reshape(1,3), columns=list('ABC'))
df4

   A  B  C
0  1  2  3

df4.loc[df4.index.max() + 1, :] = [4, 5, 6]
df4
     A    B    C
0  1.0  2.0  3.0
1  4.0  5.0  6.0

Or, using append with ignore_index=True:

df4.append(pd.Series(dict(zip(df4.columns, [4, 5, 6]))), ignore_index=True)

   A  B  C
0  1  2  3
1  4  5  6
Share:
22,366
JFerro
Author by

JFerro

NLP with Spacy Pandas Networkx ipywidgets, ipysheets, voila, ipyvuewtify in Jupyter Hub environement NLP for patent literature. Feature extraction. EPC & PCT compliance based on NLP techniques. Interested in Machine learning for information extraction in EN, FR, DE, NL, SP, PT languages.

Updated on September 16, 2020

Comments

  • JFerro
    JFerro over 3 years

    Despite of the numerous stack overflow questions on appending data to a dataframe I could not really find an answer to the following. I am looking for a straight forward solution to append a list as last row of a dataframe. Imagine I have a simple dataframe:

     indexlist=['one']
     columnList=list('ABC')
     values=np.array([1,2,3])
     # take care, the values array is a 3x1 size array. 
     # row has to be 1x3 so we have to reshape it
    
    values=values.reshape(1,3)
    df3=pd.DataFrame(values,index=indexlist,columns=columnList)
    print(df3)
    
         A  B  C
    one  1  2  3
    

    After some operations I get the following list:

    listtwo=[4,5,6]
    

    I want to append it at the end of the dataframe. I change that list into a series:

    oseries=pd.Series(listtwo)
    print(type(oseries))
    oseries.name="two"
    

    now, this does not work:

    df3.append(oseries)
    

    since it gives:

    A   B   C   0   1   2
    one 1.0 2.0 3.0 NaN NaN NaN
    two NaN NaN NaN 5.0 6.0 7.0
    

    I would like to have the values under A B and C.

    I also tried:

    df3.append(oseries, columns=list('ABC'))  *** not working ***
    df3.append(oseries, ignore_index=True)  *** working but wrong result
    df3.append(oseries, ignore_index=False) *** working but wrong result
    
    df3.loc[oseries.name]=oseries adds a row with NaN values
    

    what I am looking for is a) how can I add a list to a particular index name b) how can I simple add a row of values out of a list even if I don't have a name for index (leave it empty)

  • JFerro
    JFerro over 5 years
    Thanks. What if I am not using an index. Simply adding rows of data for later processing. Why is this not working:? df4=pd.DataFrame(np.array([1,2,3]).reshape(1,3),columns=list‌​('ABC')) newlist=[5,6,7] df4.append(newlist) be aware the dataframe was created on purpose without index.
  • cs95
    cs95 over 5 years
    @Berlines Simply because df4.append was not intended to work with lists directly. If you are appending a single row, you must either supply a pd.Series object (which you did and noticed there was an issue aligning the columns), or use loc and assign in-place.
  • cs95
    cs95 over 5 years
    @Berlines Quite so.