2017-02-06 17 views
3

У меня есть рамка данных pandas со столбцом из списков.
Цель состоит в том, чтобы найти мин каждого списка в строке (эффективным способом).Как получить минимальное значение списка строк в кадре данных pandas

E.g.

import pandas as pd 
df = pd.DataFrame(columns=['Lists', 'Min']) 
df['Lists'] = [ [1,2,3], [4,5,6], [7,8,9] ] 
print(df) 

Цель является Min колонка:

 Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Спасибо заранее,
Гил

+0

Поскольку ваши 'pandas' структур данных с помощью' object' DTYPE, вы убиваете эффективность. –

+0

@ juanpa.arrivillaga это результат этого алгоритма 'df [" b "] = np.array (map (list, [df [" a "]. Shift (x) для x в диапазоне (1,4)])). T.tolist() '- см. [Http://stackoverflow.com/questions/37967824/how-to-add-a-column-to-a-pandas-dataframe-made-of-arrays-of- -н-предшествующее-Valu]. Есть ли способ ускорить работу? – Gilberto

+1

Проблема в том, что вы помещаете списки в свой 'DataFrame', создавая его из dtype' object'. Dtype наследуется для базовой структуры данных numpy, а типы d объектов - медленные. Это не алгоритм, это ваша структура данных. –

ответ

4

Вы можете использовать apply с min:

df['Min'] = df.Lists.apply(lambda x: min(x)) 
print (df) 
     Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Спасибоза идею:

df['Min'] = [min(x) for x in df.Lists.tolist()] 
print (df) 
     Lists Min 
0 [1, 2, 3] 1 
1 [4, 5, 6] 4 
2 [7, 8, 9] 7 

Timings:

##[300000 rows x 2 columns] 
df = pd.concat([df]*100000).reset_index(drop=True) 

In [144]: %timeit df['Min1'] = [min(x) for x in df.Lists.values.tolist()] 
10 loops, best of 3: 137 ms per loop 

In [145]: %timeit df['Min2'] = [min(x) for x in df.Lists.tolist()] 
10 loops, best of 3: 142 ms per loop 

In [146]: %timeit df['Min3'] = [min(x) for x in df.Lists] 
10 loops, best of 3: 139 ms per loop 

In [147]: %timeit df['Min4'] = df.Lists.apply(lambda x: min(x)) 
10 loops, best of 3: 170 ms per loop 
+2

Черт, понимание списка в столбце «Списки» может быть быстрее. –

+0

Спасибо @jezrael (удивительная скорость ответа) – Gilberto

+0

@ juanpa.arrivillaga Спасибо. – Gilberto