/ / konkatenuje wiele kolumn na podstawie indeksu w pandach - python, pandy

łączenie wielu kolumn na podstawie indeksu w pandach - python, pandy

Jako kontynuację ten post, Chciałbym połączyć kilka kolumnna podstawie ich indeksu, ale mam pewne problemy. W tym przykładzie otrzymuję błąd atrybutu związany z funkcją mapy. Doceniona zostanie pomoc związana z tym błędem, podobnie jak kod wykonujący równoważną konkatenację kolumn.

    #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

dzięki, zach cp

Odpowiedzi:

6 dla odpowiedzi № 1

Co powiesz na coś takiego?

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

Jeśli masz None obiekty unoszące się wokół, możesz sobie z tym poradzić. Na przykład:

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

W języku prawie angielskim:

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

Za pomocą filter:

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

itp. Możesz to zrobić w jednym wierszu, ale myślę, że łatwiej jest to rozdzielić.