/ / об'єднати кілька стовпців на основі індексу в пандах - python, pandas

об'єднати кілька стовпчиків на основі індексу в пандах - python, pandas

Як слідувати до цей пост, Я хотів би об'єднати ряд стовпціввиходячи з їх індексу, але у мене виникають деякі проблеми. У цьому прикладі я отримую помилку атрибутів, пов’язану з функцією карти. Довідка навколо цієї помилки буде вдячна, як і код, який робить еквівалентне конкатенація стовпців.

    #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

Спасибі, zach cp

Відповіді:

6 за відповідь № 1

Як про щось подібне?

>>> 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

Якщо у вас є None об'єкти, що плавають навколо, ви могли б впоратися і з цим. Наприклад:

>>> 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

На англійській мові:

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

Використовуючи filter:

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

Ви можете зробити це в один рядок, але я вважаю, що це зрозуміліше розділити.