2017-01-20 4 views
2

Ich habe einen Datenrahmen, der wie folgt aussieht:Wie Element zur Liste der anderen Spalte in Pandas anhängen

dic = {'A':['PINCO','PALLO','CAPPO','ALLOP'], 
     'B':['KILO','KULO','FIGA','GAGO'], 
     'C':[['CAL','GOL','TOA','PIA','STO'], 
      ['LOL','DAL','ERS','BUS','TIS'], 
      ['PIS','IPS','ZSP','YAS','TUS'], 
      []]} 
df1 = pd.DataFrame(dic) 

Mein Ziel für jede Zeile des Element der A als erstes Element der Liste enthielt einzufügen ist in Spalte C. Gleichzeitig möchte ich das Element B als letzten Punkt der Liste in setzen.

konnte ich mein Ziel erreichen, indem Sie die folgenden Zeilen von Code verwendet:

for index, row in df1.iterrows(): 
    try: 
     row['C'].insert(0,row['A']) 
     row['C'].append(row['B']) 
    except: 
     pass 

Gibt es eine elegante und effiziente Art und Weise, mein Ziel zu erreichen, vielleicht einige Pandas-Funktion? Ich möchte möglicherweise für Schleifen vermeiden.

+0

Sie können dies mit 'df1.C = df1.apply (lambda x: [xA] + xC + [xB] Achse = 1)', das etwas schöner ist, aber es ist NICHT wirklich effizient ... – MaxU

Antwort

2

Eine gute allgemeine Regel apply zu vermeiden, ist mit mit axis=1, wenn überhaupt möglich, da Iterieren über die Zeilen ist teuer

Sie können jedes Element in den Spalten A und B in eine Liste mit map konvertieren und dann über die Zeilen summieren.

df1['A'] = df1.A.map(lambda x: [x]) 
df1['B'] = df1.B.map(lambda x: [x]) 
df1.sum(1) 
CPU times: user 3.07 s, sys: 207 ms, total: 3.27 s 

Die Alternative ist apply mit der Achse verwenden = 1, die 15-mal lief langsamer auf meinem Computer auf 1 Million Zeilen

df1.apply(lambda x: [x['A']] + x['C'] + [x['B']], 1) 
CPU times: user 48.5 s, sys: 119 ms, total: 48.6 s 
+0

Schöne Lösung! – MaxU

2

Inspiriert von Ted Lösung aber ohne Spalt A und B zu ändern:

def tolist(value): 
    return [value] 

df1.C = df1.A.map(tolist) + df1.C + df1.B.map(tolist) 

Mit apply, würden Sie eine explizite Schleife nicht schreiben:

def modify(row): 
    row['C'][:] = [row['A']] + row['C'] + [row['B']] 

df1.apply(modify, axis=1) 
+0

'df1.A.map (tolist) + df1.C + df1.B.map (tolist)' +1 – MaxU

0

Verwenden Sie eine Liste Verständnis mit df1.values.tolist()

pd.Series([[r[0]] + r[2] + [r[1]] for r in df1.values.tolist()], df1.index) 

0 [PINCO, CAL, GOL, TOA, PIA, STO, KILO] 
1 [PALLO, LOL, DAL, ERS, BUS, TIS, KULO] 
2 [CAPPO, PIS, IPS, ZSP, YAS, TUS, FIGA] 
3        [ALLOP, GAGO] 
dtype: object 

Zeittest

enter image description here

Verwandte Themen