Is there a way to concatenate the content of the respective cells of two different n * n data-frames within cells in pandas?
For example: Say I have two data-frames df1 and df2.
df1 looks like this:
| Index | Score_1 | Score_2 |
|---|---|---|
| Family_1 | 123 | 456 |
| Family_2 | 789 | 1011 |
df2 looks like this:
| Index | Score_1 | Score_2 |
|---|---|---|
| Family_1 | A | B |
| Family_2 | C | D |
I want to make a third data-frame that takes each n * n cell from df1 and concatenate it with the content from a respective n * n cell from df2 and make a third data-frame that looks something like this:
| Index | Score_1 | Score_2 |
|---|---|---|
| Family_1 | A:123 | B:456 |
| Family_2 | C:789 | D:1011 |
Just to make sure: One table has strings and the other has numbers but I want to do string concatenation so using str() is necessary is fine.
pd.concat() concats whole data-frames like this:
| Index | Score_1 | Score_2 | Score_1 | Score_2 |
|---|---|---|---|---|
| Family_1 | A | B | 123 | 456 |
| Family_2 | C | D | 789 | 1011 |
I am trying to superimpose the cells instead.
I tried to do it from scratch with zip and intertuples roughly like this:
for i,j in zip(df1.itertuples(),df2.itertuples()):
n=1
while n < len(i):
print(i[n], ":", j[n])
n = n + 1
print('n')
Whose output is along the lines of:
A:123
B:456
C:789
D:1011
Which I think I can reroute to dicts or an intermediate file and reshape from there but that seems a little unwieldy. Is there a more efficient way to do this?
Advertisement
Answer
You can temporarily set “Index” as index, convert to string, and add:
out = (df2
.set_index('Index') # skip if already index
.add(':'+df1.set_index('Index').astype(str))
.reset_index() # skip if already index
)
output:
Index Score_1 Score_2 0 Family_1 A:123 B:456 1 Family_2 C:789 D:1011
If “Index” is already the index:
out = df2.add(':'+df1.astype(str))
output:
Score_1 Score_2 Index Family_1 A:123 B:456 Family_2 C:789 D:1011