Я подозреваю, что вы пытались использовать np.vectorize
, потому что вы прочитали, что numpy 'векторизация' - это способ ускорения pandas
кода.
In [29]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A','B','C'])
In [30]: df
Out[30]:
A B C
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
Медленный построчно, Подход к получению строки означает:
In [31]: df.apply(lambda row: np.mean(row), axis=1)
Out[31]:
0 1.0
1 4.0
2 7.0
3 10.0
dtype: float64
Быстрый numpy метод:
In [32]: df.to_numpy()
Out[32]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [33]: df.to_numpy().mean(axis=1)
Out[33]: array([ 1., 4., 7., 10.])
То есть мы получаем массив значений данных и используем метод быстрой компиляции рассчитать рядные средства.
Но чтобы сделать что-то похожее на словарь для каждой строки:
In [35]: df.apply(lambda row: {str(k):k for k in row}, axis=1)
Out[35]:
0 {'0': 0, '1': 1, '2': 2}
1 {'3': 3, '4': 4, '5': 5}
2 {'6': 6, '7': 7, '8': 8}
3 {'9': 9, '10': 10, '11': 11}
dtype: object
Мы должны выполнять итерации по строкам массива, как мы делаем с фреймом данных apply
:
In [36]: [{str(k):k for k in row} for row in df.to_numpy()]
Out[36]:
[{'0': 0, '1': 1, '2': 2},
{'3': 3, '4': 4, '5': 5},
{'6': 6, '7': 7, '8': 8},
{'9': 9, '10': 10, '11': 11}]
Подход к массиву быстрее:
In [37]: timeit df.apply(lambda row: {str(k):k for k in row}, axis=1)
1.13 ms ± 702 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [38]: timeit [{str(k):k for k in row} for row in df.to_numpy()]
40.8 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Но метод apply
возвращает кадр данных, а не список. Я подозреваю, что большая часть дополнительного времени находится на этом шаге.
np.vectorize
(и np.frompyfunc
) также может использоваться для итерации массива, но по умолчанию используется итерация по элементам, а не по строкам или столбцам , Как правило, они медленнее, чем более явная итерация (как я делаю в [36]).
Неуклюжий способ создания кадра данных из списка:
In [53]: %%timeit
...: df1 = pd.DataFrame(['one','two','three','four'],columns=['d'])
...: df1['d'] =[{str(k):k for k in row} for row in df.to_numpy()]
572 µs ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)