Как умножить столбец dataframe на журнал с помощью julia? - PullRequest
2 голосов
/ 15 февраля 2020

У меня есть датафрейм. Я хочу умножить столбец "b" на "log", а затем заменить NaN на 0 с.

Как я могу это сделать в Джулии? Я проверяю это: DataFrames.jl Но я не понимаю.

df = DataFrame(a = repeat([1, 2, 3, 4], outer=[2]),
           b = repeat([2, 1], outer=[4]),
           c = randn(8))

enter image description here

Ответы [ 2 ]

5 голосов
/ 15 февраля 2020

Я хочу умножить столбец "b" на "log"

Предполагая, что вы хотите применить (натуральное) log к каждому элементу в столбце :b Вы можете сделать следующее:

log.(df.b)

log(x) применяет (натуральный) журнал к отдельному элементу x. Поставив точку после журнала, вы транслируете функцию log на каждый элемент.

Если вы хотите заменить столбец b, выполните следующее:

df.b = log.(df.b)

и затем замените NaN на 0s

Я предполагаю, что вы хотите обработать случай, когда у вас есть DomainError (ie, принимающий log отрицательного числа). Лучше всего обработать ошибку до ее появления:

map( x -> x <= 0 ? 0.0 : log(x), df.b)

Это отображает анонимную функцию x -> x <= 0 ? 0.0 : log(x) для каждого элемента столбца b в вашем DataFrame. , Эта функция проверяет, является ли x меньше нуля - если да, возвращает 0.0, иначе возвращает log(x). Этот «однострочный if оператор» называется троичным оператором .

4 голосов
/ 15 февраля 2020

Используйте генератор:

( v <= 0. ? 0. : log(v) for v in df.c )

Если вы хотите добавить новый столбец:

df[!, :d] .= ( v <= 0. ? 0. : log(v) for v in df.c)

Это быстрее, чем при использовании map (эти тесты предполагают, что df.d уже выходит:

julia> using BenchmarkTools

julia> @btime $df[!, :d] .= ( v <= 0.0 ? 0.0 : log(v) for v in $df.c)
  1.440 μs (14 allocations: 720 bytes)

julia> @btime $df[!, :d] .= map( x -> x <= 0.0 ? 0.0 : log(x), $df.c);
  1.570 μs (14 allocations: 720 bytes)
...