pandasを使用したデータの加工・演算方法を簡単にまとめてみた
負の値を0に置換するには
データ分析では、異常値を扱うこともよくあります。たとえば、電力センサーから得られる電気使用量が負になっていることがあり、それではデータの品質や信頼性に問題がある可能性があります。
今回はそのようなデータを補正する方法を記載します。
今回は以下のコードを扱います。
import pandas as pd
sr = pd.Series([115, -234, 987])
sr
上記のコードに-234という負の数が存在します。
これは計器の不具合で負の値があったと仮定します。その場合、負の値を 0 に置き換えて表示します。
期待する値としては、
-234を0
と表示されるようにします。
今回の場合は、where文を使用すると良さそうです。
where(条件, 別の値)は、条件を満たすときに元の値を返し、そうでないときに別の値を返します。これを使えば、負のときに 0 を返すようにできます。 負の逆は、非負なのでsr >= 0になります。
以下のコード書きましょう。
sr.where(sr >= 0, 0)
実行することで、期待する結果が返ってきます。
補足ですが、
maskで書いてもできるらしいです。
sr.mask(sr >= 0, 0)
僕はwhereの方が仲良いのでwhereにします。。
欠損値を置換するには
データの変換ミスやセンサーの不具合などさまざまな理由により、データが欠損していることがあります。欠損データの扱い方はいろいろありますが、今回は直前の行の値による補完方法を記載します。
以下のようなデータです。
日付 売上
0 2021-01-01 100
1 2021-01-02 110
2 2021-01-03 150
3 2021-01-04 NaN
4 2021-01-05 200
NaNというところが欠損しているデータです。
この場合、NaNを置き換えるには、fillna()の引数methodに"ffill"
を指定します。これは、forward fillを意味します。
もし直後の値で埋めたい場合には、method に "bfill" を指定します。こ れは、backward fillを意味します。
売り上げのカラムをsalesと仮定します。
以下のコードを書いてみます。
df.sales.fillna(method="bfill")
上記では引数にbfillを指定しているので、NaNは200になります。
引数にffillを指定した場合は、NaNは150になります。
上記を実行すると期待する出力(200)に置き換えられます。
欠損値を別の列の値で補完するには
今回はある列の欠損値を補完するときに、別の列の値で補完する方法を記載します。
例えば、以下のようなデータを指します。
Name Subject Point Last
0 Alice 国語 87 82.0
1 Alice 数学 79 NaN
2 Bob 国語 77 NaN
3 Bob 数学 90 89.0
Lactの列にNaNが発生していることが確認できました。
このNaNの値にPointの値を入れて、補完していくとします。
期待するイメージは以下のようなかんじです。
Name Subject Point Last
0 Alice 国語 87 82.0
1 Alice 数学 79 79
2 Bob 国語 77 77
3 Bob 数学 90 89.0
この場合、fillna() を使用していきます。
埋めたい値が別の列にある場合は、fillna( 別の列 ) とします。こんかいの場合だと、
df.Last. fillna(df.Point) とすることで、Last の欠損しているところに、同じ行 の Point の値を埋めます。また、inplace=True とすることで、df を更新 できます。
以下のようなコードになります。
df.Last.fillna(df.Point, inplace=True)
実行することで、期待するデータになります。
特定の列のTop3の順位を追加するには
重要度の高いデータに着目して処理したい時、Top3の順位を追加する方法を記載します。
例えば、以下のデータがあるとします。
Name Subject Point
0 Alice 国語 92
1 Alice 数学 72
2 Bob 国語 65
3 Bob 数学 92
上記のデータを以下のように、
Name Subject Point Rank
0 Alice 国語 97 1.0
1 Alice 数学 75 3.0
2 Bob 国語 63 NaN
3 Bob 数学 97 2.0
列 Point の Top3 の順位を求め、新しい列Rankとして追加します。
今回は、新しい列Rankを作成して順位である[1, 2, 3]を設定します。
df.loc[Top3のインデックス, "Rank"] = [1, 2, 3]
Top3 のインデックスを求めるには、まずは列 Point の上位 3 個を得る必要 があります。これは、nlargest() で引数に 3 を指定して取得できます。なお、同じ値が複数ある場合は、上の行が優先されます。
df.Point.nlargest(3)
よって最終的なコードは、
df.loc[df.Point.nlargest(3).index, "Rank"] = [1, 2, 3]
になります。
公式的なものは
df.loc[追加したい要素のインデックス, 新しい列名] = 追加するデータ
このような感じです。
実行すると、期待通りに表示されます。
Discussion