#python #arrays #performance #pandas #numpy
#python #массивы #Производительность #pandas #numpy
Вопрос:
У меня есть 33620×160 pandas
DataFrame
, в котором есть один столбец, содержащий списки чисел. Каждая запись списка в DataFrame
содержит 30 элементов.
df['dlrs_col']
0 [0.048142470608688, 0.047021138711858, 0.04573...
1 [0.048142470608688, 0.047021138711858, 0.04573...
2 [0.048142470608688, 0.047021138711858, 0.04573...
3 [0.048142470608688, 0.047021138711858, 0.04573...
4 [0.048142470608688, 0.047021138711858, 0.04573...
5 [0.048142470608688, 0.047021138711858, 0.04573...
6 [0.048142470608688, 0.047021138711858, 0.04573...
7 [0.048142470608688, 0.047021138711858, 0.04573...
8 [0.048142470608688, 0.047021138711858, 0.04573...
9 [0.048142470608688, 0.047021138711858, 0.04573...
10 [0.048142470608688, 0.047021138711858, 0.04573...
Я создаю массив размером 33620×30, записи которого представляют собой значения, не включенные в список, из этого единственного DataFrame
столбца. В настоящее время я делаю это как:
np.array(df['dlrs_col'].tolist(), dtype = 'float64')
Это работает просто отлично, но занимает значительное количество времени, особенно если учесть, что я выполняю аналогичные вычисления для 6 дополнительных столбцов списков. Есть идеи о том, как я могу ускорить это?
Ответ №1:
вы можете сделать это следующим образом:
In [140]: df
Out[140]:
dlrs_col
0 [0.048142470608688, 0.047021138711858, 0.04573]
1 [0.048142470608688, 0.047021138711858, 0.04573]
2 [0.048142470608688, 0.047021138711858, 0.04573]
3 [0.048142470608688, 0.047021138711858, 0.04573]
4 [0.048142470608688, 0.047021138711858, 0.04573]
5 [0.048142470608688, 0.047021138711858, 0.04573]
6 [0.048142470608688, 0.047021138711858, 0.04573]
7 [0.048142470608688, 0.047021138711858, 0.04573]
8 [0.048142470608688, 0.047021138711858, 0.04573]
9 [0.048142470608688, 0.047021138711858, 0.04573]
In [141]: df.dlrs_col.apply(pd.Series)
Out[141]:
0 1 2
0 0.048142 0.047021 0.04573
1 0.048142 0.047021 0.04573
2 0.048142 0.047021 0.04573
3 0.048142 0.047021 0.04573
4 0.048142 0.047021 0.04573
5 0.048142 0.047021 0.04573
6 0.048142 0.047021 0.04573
7 0.048142 0.047021 0.04573
8 0.048142 0.047021 0.04573
9 0.048142 0.047021 0.04573
In [142]: df.dlrs_col.apply(pd.Series).values
Out[142]:
array([[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ],
[ 0.04814247, 0.04702114, 0.04573 ]])
Комментарии:
1. Я ценю ответ, но в моем быстром тестировании это заняло почти в два раза больше времени, чем мой предыдущий метод.
Ответ №2:
Сначала вы можете преобразовать в numpy array
values
:
df = pd.DataFrame({'dlrs_col':[
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573],
[0.048142470608688, 0.047021138711858, 0.04573]]})
print (df)
dlrs_col
0 [0.048142470608688, 0.047021138711858, 0.04573]
1 [0.048142470608688, 0.047021138711858, 0.04573]
2 [0.048142470608688, 0.047021138711858, 0.04573]
3 [0.048142470608688, 0.047021138711858, 0.04573]
4 [0.048142470608688, 0.047021138711858, 0.04573]
5 [0.048142470608688, 0.047021138711858, 0.04573]
6 [0.048142470608688, 0.047021138711858, 0.04573]
7 [0.048142470608688, 0.047021138711858, 0.04573]
print (np.array(df['dlrs_col'].values.tolist(), dtype = 'float64'))
[[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]
[ 0.04814247 0.04702114 0.04573 ]]
Тайминги:
In [56]: %timeit (np.array(df['dlrs_col'].values.tolist(), dtype = 'float64'))
The slowest run took 9.76 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 14.1 µs per loop
In [57]: %timeit (np.array(df['dlrs_col'].tolist(), dtype = 'float64'))
The slowest run took 9.33 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 28.4 µs per loop