избегайте повторения имени кадра данных при работе со столбцами панд - PullRequest
3 голосов
/ 28 мая 2019

Очень вопрос новичка, извините: есть ли способ избежать повторения имени кадра данных при работе со столбцами панд?

В R , data.table позволяет работать со столбцом без повторения имени кадра данных, подобного этому

very_long_dt_name = data.table::data.table(col1=c(1,2,3),col2=c(3,3,1))

# operate on the columns without repeating the dt name:

very_long_dt_name[,ratio:=round(col1/col2,2)]

Я не мог понять, как это сделать с пандами в Python , поэтому я продолжаю повторять имя df:

data = {'col1': [1,2,3], 'col2': [3, 3, 1]}
very_long_df_name = pd.DataFrame(data)

# operate on the columns requires repeating the df name

very_long_df_name['ratio'] = np.round(very_long_df_name['col1']/very_long_df_name['col2'],2)

Я уверен, что есть способ избежать этого, но я ничего не могу найти в Google. Любой намек, пожалуйста? Спасибо.

1 Ответ

3 голосов
/ 28 мая 2019

Попробуйте assign:

very_long_df_name.assign(ratio=lambda x: np.round(x.col1/x.col2,2))

Выход:

    col1    col2    ratio
0   1       3       0.33
1   2       3       0.67
2   3       1       3.00

Редактировать: чтобы отразить комментарии, тесты на 1 миллион строк:

%%timeit
very_long_df_name.assign(ratio = lambda x:x.col1/x.col2)
# 18.6 ms ± 506 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

и

%%timeit
very_long_df_name['ratio'] = very_long_df_name['col1']/very_long_df_name['col2']
# 13.3 ms ± 359 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

А с np.round, assign

%%timeit
very_long_df_name.assign(ratio = lambda x: np.round(x.col1/x.col2,2))
# 64.8 ms ± 958 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

а не - assign:

%%timeit
very_long_df_name['ratio'] = np.round(very_long_df_name['col1']/very_long_df_name['col2'],2)
# 55.8 ms ± 2.43 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

ТАК что кажется, что присвоение векторизовано, но не так хорошо настроено.

...