anon
anon

Reputation: 866

How to verticaly merge in a single cell all the rows in a dataframe?

Given a pandas dataframe:

l1 = ["Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?",
     "Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.",
     "Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus.",
     "On the other hand, we denounce with righteous indignation and dislike men who",
     "he rejects pleasures to secure other greater pleasures, or else he endures pains to avoid worse pains."]


l2 = ["Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.",
     "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat.",
     "Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est.",
     "Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae.",
     "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur?"]


a = pd.DataFrame(l1, columns=['Col 1'])
b = pd.DataFrame(l2, columns=['Col 2'])

df = pd.concat([a, b], axis=1)

How can I concat in a single cell, vertically the all rows belowe the column. That is, the dataframe shape should go from (5, 2) to (2, 2), where the frist row are the names of the columns and the second row is the concatnation of all the strings, separated by a new line.

Upvotes: 1

Views: 48

Answers (2)

mzakaria
mzakaria

Reputation: 649

first this is NOT the right way to use pandas :D
second, I tried to hack my way, here is a step by step

join text togeter

df['Col 1'] =  df.groupby(level=0)['Col 1'].transform(lambda x : '\n'.join(x)).sum()
df['Col 2'] =  df.groupby(level=0)['Col 2'].transform(lambda x : '\n'.join(x)).sum()

This has each row with all the text, so we select only one row

df = df.iloc[0,[0,1]]
df = pd.DataFrame(df).transpose()

which gives you this

    Col 1                                               Col 2  
0   Ut enim ad minima veniam, quis nostrum exercit...   Sed ut perspiciatis unde omnis iste natus erro...

what is left is adding the column as a row at the end

df.loc[len(df.index)] = df.columns.values.tolist()

and finally reverse order

df = df.sort_index(ascending = False)

Upvotes: 1

Quang Hoang
Quang Hoang

Reputation: 150805

Do you mean:

df = pd.concat([a, b], axis=1).apply(' '.join).to_frame().T

Or safer (when a and b don't have the same size):

pd.concat([x.apply('\n'.join) for x in (a,b)]).to_frame().T

Output (note that this has shape 1 x 2):

                                               Col 1                                              Col 2
0  Ut enim ad minima veniam, quis nostrum exercit...  Sed ut perspiciatis unde omnis iste natus erro...

Upvotes: 1

Related Questions