2017-07-10 7 views
5

-Code erstellen Probe Datenrahmen zu erstellen:Kombinieren Zahlen aus zwei Spalten ein Array

Sample = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': [[.332, .326], [.058, .138]]}, 
    {'account': 'Alpha Co', 'Jan': 200, 'Feb': 210, 'Mar': [[.234, .246], [.234, .395]]}, 
    {'account': 'Blue Inc', 'Jan': 50, 'Feb': 90, 'Mar': [[.084, .23], [.745, .923]]}] 
df = pd.DataFrame(Sample) 

Beispieldatenrahmen sichtbar gemacht:

df: 
    account  Jan  Feb   Mar 
Jones LLC |  150 | 200 | [.332, .326], [.058, .138] 
Alpha Co |  200 | 210 | [[.234, .246], [.234, .395] 
Blue Inc |  50 | 90  | [[.084, .23], [.745, .923] 

Ich bin für eine Formel suchen Jan und Februar Spalten zu kombinieren, in ein Array, das in einer neuen Spalte dieses Array ausgibt.

Erwarteter Ausgang:

df: 
    account  Jan  Feb   Mar        New 
Jones LLC |  150 | 200 | [.332, .326], [.058, .138] | [150, 200] 
Alpha Co |  200 | 210 | [[.234, .246], [.234, .395] | [200, 210] 
Blue Inc |  50 | 90  | [[.084, .23], [.745, .923] | [50, 90] 
+1

Denken Sie an die Geschwindigkeit der Anwendung. Sehen Sie meinen Beitrag für einen Vergleich der beiden. – piRSquared

Antwort

6

Verwenden df.apply, mit axis=1:

In [1980]: df['New'] = df.apply(lambda x: [x['Jan'], x['Feb']], axis=1) 

In [1981]: df 
Out[1981]: 
    Feb Jan        Mar account   New 
0 200 150 [[0.332, 0.326], [0.058, 0.138]] Jones LLC [150, 200] 
1 210 200 [[0.234, 0.246], [0.234, 0.395]] Alpha Co [200, 210] 
2 90 50 [[0.084, 0.23], [0.745, 0.923]] Blue Inc [50, 90] 

Wenn Sie Ihre ursprüngliche Spalten löschen möchten, können Sie

df.drop(['Jan', 'Feb'], axis=1, inplace=True) 

A verwenden schneller lös Ion kann here gefunden werden.

+1

! Vielen Dank. Das hat funktioniert. Ich kann keine Antwort für ein paar weitere Minuten akzeptieren, aber ich werde :) –

3

Sie auch df['New'] = list(zip(df.Feb, df.Jan))

oder mit tolistdf['New'] = df.ix[:,0:2].values.tolist()

+1

Ich mag diese Antwort – piRSquared

6

Verwenden values.tolist

df.assign(New=df[['Feb', 'Jan']].values.tolist()) 
# inplace... use this 
# df['New'] = df[['Feb', 'Jan']].values.tolist() 

    Feb Jan        Mar account   New 
0 200 150 [[0.332, 0.326], [0.058, 0.138]] Jones LLC [200, 150] 
1 210 200 [[0.234, 0.246], [0.234, 0.395]] Alpha Co [210, 200] 
2 90 50 [[0.084, 0.23], [0.745, 0.923]] Blue Inc [90, 50] 

-Timing mit größeren Daten
apply zu vermeiden, ist mehr als 60-mal schneller mit einer 3000 Reihe versuchen können Datenrahmen.

df = pd.concat([df] * 1000, ignore_index=True) 

%timeit df.assign(New=df[['Feb', 'Jan']].values.tolist()) 
%timeit df.assign(New=df.apply(lambda x: [x['Jan'], x['Feb']], axis=1)) 

1000 loops, best of 3: 947 µs per loop 
10 loops, best of 3: 61.7 ms per loop 

und 160-mal schneller für 30.000 Reihe Datenrahmen

df = pd.concat([df] * 10000, ignore_index=True) 

100 loops, best of 3: 3.58 ms per loop 
1 loop, best of 3: 586 ms per loop 
+0

Das ist, was ich tun möchte, ich bin nur der Meinung, "apply" ist Ineffizienz für große Datenmenge, die nur eine Erweiterung für 'für Schleife ", aber Sie haben es bewiesen !!! Danke dir piR +1 – Wen

Verwandte Themen