LoginSignup
0
0

More than 1 year has passed since last update.

データフレームの missing の置換

Last updated at Posted at 2023-02-05

データフレームの missing の置換

Julia の Query で,データフレームのとある列の missing を別の値に置換したい場合,変数名を指定するとうまく行かない。

以下のようなデータフレームを例に取る。

using DataFrames
using Query

df = DataFrame(a=[1, 2, missing, 4, 5], b=11:15)
5×2 DataFrame
Row a b
Int64? Int64
1 1 11
2 2 12
3 missing 13
4 4 14
5 5 15

a 列にある missing を定数値で置き換えるのは難なくできる。

df |>
    @replacena(:a => 12345) |>
    DataFrame

5×2 DataFrame
Row a b
Int64 Int64
1 1 11
2 2 12
3 12345 13
4 4 14
5 5 15

しかし,置き換えるべきものが変数に格納されているときには,そうは行かない。

replacevalue = 12345
df |>
    @replacena(:a => replacevalue) |>
    DataFrame
UndefVarError: replacevalue not defined

以下略

あれこれやってみたり,検索したりしても
https://discourse.julialang.org/t/replacena-not-working-with-variables-as-replacement-value/45401
でも,結局結論は出ていないようだ。有耶無耶になっているのかなあ。

そこで色々やってみた。

まずは,目的の列の missing を「とりあえずの数値」に置き換える。

@replacena(:a => 99999)

次に,「とりあえずの数値」を本来望むべき値を持つ列の値で置き換える。

@mutate(a=_.a == 99999 ? replacevalue : _.a)

この,回りくどい方法でやっと,目的地にたどり着くことができた。

注意すべきことは「とりあえずの数値」を適切に選ぶ必要がある。本来その列に存在しない値を選ばなければならない。

replacevalue = 12345
df |>
    # @replacena(:a => replacevalue) |> エラーになる。変数名は指定できない。ので,以下の 3 行でやる。
    @replacena(:a => 99999) |>
    @mutate(a = _.a == 99999 ? replacevalue : _.a) |>
    DataFrame
5×2 DataFrame
Row a b
Any Any
1 1 11
2 2 12
3 12345 13
4 4 14
5 5 15

ということで,目出度く a 列の missingreplacevalue = 12345 に変更された。

他に解決策はないのだろうか。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0