Appending two dataframes with same columns, different order

PythonJoinPandasAppend

Python Problem Overview


I have two pandas dataframes.

noclickDF = DataFrame([[0, 123, 321], [0, 1543, 432]],
                      columns=['click', 'id', 'location'])
clickDF = DataFrame([[1, 123, 421], [1, 1543, 436]],
                      columns=['click', 'location','id'])

I simply want to join such that the final DF will look like:

click  |  id   |   location
0         123        321
0         1543       432
1         421        123
1         436       1543

As you can see the column names of both original DF's are the same, but not in the same order. Also there is no join in a column.

Python Solutions


Solution 1 - Python

You could also use pd.concat:

In [36]: pd.concat([noclickDF, clickDF], ignore_index=True)
Out[36]: 
   click    id  location
0      0   123       321
1      0  1543       432
2      1   421       123
3      1   436      1543

Under the hood, DataFrame.append calls pd.concat. DataFrame.append has code for handling various types of input, such as Series, tuples, lists and dicts. If you pass it a DataFrame, it passes straight through to pd.concat, so using pd.concat is a bit more direct.

Solution 2 - Python

For future users (sometime >pandas 0.23.0):

You may also need to add sort=True to sort the non-concatenation axis when it is not already aligned (i.e. to retain the OP's desired concatenation behavior). I used the code contributed above and got a warning, see https://stackoverflow.com/questions/50501787/python-pandas-user-warning. The code below works and does not throw a warning.

In [36]: pd.concat([noclickDF, clickDF], ignore_index=True, sort=True)
Out[36]: 
   click    id  location
0      0   123       321
1      0  1543       432
2      1   421       123
3      1   436      1543

Solution 3 - Python

You can use append for that

 df = noclickDF.append(clickDF)
 print df 

    click    id  location
 0      0   123       321  
 1      0  1543       432
 0      1   421       123
 1      1   436      1543

and if you need you can reset the index by

df.reset_index(drop=True)
print df
   click    id  location
0      0   123       321
1      0  1543       432
2      1   421       123
3      1   436      1543

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionredrubiaView Question on Stackoverflow
Solution 1 - PythonunutbuView Answer on Stackoverflow
Solution 2 - PythonBeau HiltonView Answer on Stackoverflow
Solution 3 - PythongreoleView Answer on Stackoverflow