concatenate multiple columns based on index in pandas

pandas, python

Solution

How about something like this?

>>> from pandas import *
>>> df = DataFrame({'A':['a','b','c'], 'B':['d','e','f'], 'C':['concat','me','yo'], 'D':['me','too','tambien']})
>>> df
   A  B       C        D
0  a  d  concat       me
1  b  e      me      too
2  c  f      yo  tambien
>>> df.columns[2:]
Index([C, D], dtype=object)
>>> df[df.columns[2:]]
        C        D
0  concat       me
1      me      too
2      yo  tambien
>>> [' '.join(row) for row in df[df.columns[2:]].values]
['concat me', 'me too', 'yo tambien']
>>> df["new"] = [' '.join(row) for row in df[df.columns[2:]].values]
>>> df
   A  B       C        D         new
0  a  d  concat       me   concat me
1  b  e      me      too      me too
2  c  f      yo  tambien  yo tambien

If you have `None` objects floating around, you could handle that too. For example:

>>> df["C"][1] = None
>>> df
   A  B       C        D
0  a  d  concat       me
1  b  e    None      too
2  c  f      yo  tambien
>>> rows = df[df.columns[2:]].values

In near-English:

>>> new = [' '.join(word for word in row if word is not None) for row in rows]
>>> new
['concat me', 'too', 'yo tambien']

Using `filter`:

>>> new = [' '.join(filter(None, row)) for row in rows]
>>> new
['concat me', 'too', 'yo tambien']

etc. You could do it in one line but I think it's clearer to separate it.

Problem

As a follow up to this post, I would like to concatenate a number of columns based on their index but I am encountering some problems. In this example I get an Attribute error related to the map function. Help around this error would be appreciated as would code that does the equivalent concatenation of columns. ``` #data df = DataFrame({'A':['a','b','c'], 'B':['d','e','f'], 'C':['concat','me','yo'], 'D':['me','too','tambien']}) #row function to concat rows with index greater than 2 def cnc(row): temp = [] for x in range(2,(len(row))): if row[x] != None: temp.append(row[x]) return map(concat, temp) #apply function per row new = df.apply(cnc,axis=1) #Expected Output new concat me me too yo tambien ``` thanks, zach cp

Original source

Related problems