2017-07-10 21 views
5

kod stworzyć przykładowy dataframe: DataframeKombajny numerów z dwóch kolumn, aby utworzyć jeden układ

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) 

Sample wizualizowane:

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] 

szukam formuły łączenia kolumn Jan i lut do jedna tablica, wyprowadzająca w Nowej kolumnie tę tablicę.

wyjście z oczekiwaniami:

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

Bądź świadomy szybkości zastosowania. Zobacz mój post na porównanie dwóch. – piRSquared

Odpowiedz

6

Zastosowanie df.apply z 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] 

Jeśli chcesz usunąć oryginalne kolumny, można użyć

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

szybsze rozpuszczanie jon można znaleźć here.

+1

! Dziękuję Ci. To zadziałało. Nie mogę przyjąć odpowiedzi przez kilka następnych minut, ale będę :) –

3

Możesz także spróbować df['New'] = list(zip(df.Feb, df.Jan))

lub korzystając tolistdf['New'] = df.ix[:,0:2].values.tolist()

+1

Podoba mi się ta odpowiedź – piRSquared

6

Korzystając 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] 

rozrządu z większymi danych
Unikanie apply jest ponad 60 razy szybciej z 3000 rzędzie ramka danych.

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 

i 160 razy szybciej do 30000 wierszy dataframe

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

To jest to, co chcę zrobić, po prostu uważam, że 'zastosować' to nieefektywność w przypadku dużego zestawu danych, który jest tylko rozszerzeniem dla' for loop', ale ty to udowodniłeś !!! Dziękuję ci pi +1 – Wen