In [3]:
df1
Out[3]:
A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
In [4]:
df2
Out[4]:
B D F
2 B2 D2 F2
3 B3 D3 F3
8 B6 D6 F6
9 B7 D7 F7

Concatenate horizontally by setting the axis parameter to columns or 1.

In [5]:
pd.concat([df1, df2], axis=1)
Out[5]:
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
8 NaN NaN NaN NaN B6 D6 F6
9 NaN NaN NaN NaN B7 D7 F7

Use the exact index from the original DataFrame.

In [6]:
pd.concat([df1, df2], axis=1).reindex(df1.index)
Out[6]:
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3

Keep the rows that have the same index by setting join to inner.

Label each piece by setting the keys parameter.

Name each level in the index by setting the names parameter.

In [7]:
pd.concat([df1, df2], axis='columns', 
          join='inner', keys=['df1', 'df2'], names=['df', None])
Out[7]:
df df1 df2
A B C D B D F
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3