wake-up-neo.net

Mischen Sie mehrere Spaltenwerte in einer Spalte in Python-Pandas

Ich habe einen Pandas-Datenrahmen wie folgt:

   Column1  Column2  Column3  Column4  Column5
 0    a        1        2        3        4
 1    a        3        4        5
 2    b        6        7        8
 3    c        7        7        

Was ich jetzt tun möchte, ist ein neues Datenframe mit Spalte1 und eine neue SpalteA zu erhalten. Diese Spalte A sollte alle Werte aus den Spalten 2 - (bis) n (wobei n die Anzahl der Spalten von Spalte 2 bis zum Ende der Zeile ist) wie folgt enthalten:

  Column1  ColumnA
0   a      1,2,3,4
1   a      3,4,5
2   b      6,7,8
3   c      7,7

Wie kann ich dieses Problem am besten angehen? Jeder Rat wäre hilfreich. Danke im Voraus!

16
sequence_hard

Sie können apply übergeben, axis=1 zu apply zeilenweise übergeben und dann den dtype in str und join konvertieren:

In [153]:
df['ColumnA'] = df[df.columns[1:]].apply(
    lambda x: ','.join(x.dropna().astype(int).astype(str)),
    axis=1
)
df

Out[153]:
  Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7

Hier rufe ich dropna auf, um die NaN loszuwerden. Wir müssen jedoch erneut in int umwandeln, damit wir nicht mit floats als str.

32
EdChum

Ich schlage vor, .assign

df2 = df.assign(ColumnA = df.Column2.astype(str) + ', ' + \
  df.Column3.astype(str) + ', ' df.Column4.astype(str) + ', ' \
  df.Column4.astype(str) + ', ' df.Column5.astype(str))

es ist einfach, vielleicht lang, aber es hat bei mir funktioniert

4
Amin Salgado

Wenn Sie viele Spalten haben, sagen Sie - 1000 Spalten in Dataframe und Sie möchten einige Spalten basierend auf particular column name zusammenführen, z. -Column2 in Frage und willkürliche Nr. von Spalten nach dieser Spalte (z. B. hier 3 Spalten nach 'Column2 einschließlich Column2 als OP-Abfrage).

Wir können die Position der Spalte mit .get_loc() - als Antwort hier erhalten.

source_col_loc = df.columns.get_loc('Column2') # column position starts from 0

df['ColumnA'] = df.iloc[:,source_col_loc+1:source_col_loc+4].apply(
    lambda x: ",".join(x.astype(str)), axis=1)

df

Column1  Column2  Column3  Column4  Column5  ColumnA
0       a        1        2        3        4  1,2,3,4
1       a        3        4        5      NaN    3,4,5
2       b        6        7        8      NaN    6,7,8
3       c        7        7      NaN      NaN      7,7

Um NaN zu entfernen, verwenden Sie .dropna() oder .fillna()

Ich hoffe es hilft!

1
Om Prakash