Reputation: 7005
I have many dataframes with the same structure - number of rows and names of columns. How can I gather all the columns with same name, but with name replaced, into a single new dataframe?
df1 = pd.DataFrame({'Name':['Tom', 'nick', 'krish', 'jack'], 'Age':[20, 21, 19, 18]})
df2 = pd.DataFrame({'Name':['Wendy', 'Frank', 'krish', 'Lucy'], 'Age':[20, 21, 19, 18]})
print(df1)
print(df2)
I want:
df3 = pd.DataFrame({'Name1':['Wendy', 'Frank', 'krish', 'Lucy'], 'Name2':['Tom', 'nick', 'krish', 'jack']})
print(df3)
Output:
df1:
Name Age
0 Tom 20
1 nick 21
2 krish 19
3 jack 18
df2:
Name Age
0 Wendy 20
1 Frank 21
2 krish 19
3 Lucy 18
df3:
Name1 Name2
0 Wendy Tom
1 Frank nick
2 krish krish
3 Lucy jack
Upvotes: 1
Views: 63
Reputation: 59579
You can concat
the two DataFrames together along axis=1
in a list comprehension. Use .add_suffix
with enumerate
to get the numbers appended to the column names.
pd.concat([df[['Name']].add_suffix(i+1) for i,df in enumerate([df2, df1])], axis=1)
Name1 Name2
0 Wendy Tom
1 Frank nick
2 krish krish
3 Lucy jack
Or if you want to do this for many similar columns at once concat
with keys
to create a MultiIndex on the columns and then collapse the MultiIndex and join the column names in a list comprehension.
l = [df2, df1]
df3 = pd.concat(l, axis=1, keys=np.arange(len(l))+1)
df3.columns = [f'{y}{x}' for x,y in df3.columns]
# Name1 Age1 Name2 Age2
#0 Wendy 20 Tom 20
#1 Frank 21 nick 21
#2 krish 19 krish 19
#3 Lucy 18 jack 18
df3.filter(like='Name')
Name1 Name2
0 Wendy Tom
1 Frank nick
2 krish krish
3 Lucy jack
Upvotes: 1
Reputation: 2706
df1 = df1.drop(column='Age')
df2 = df2.drop(column='Age')
df3 = df1.join(df2)
Upvotes: 1