🚀

pandasを使用したデータの加工・演算方法を簡単にまとめてみた

2023/06/09に公開

負の値を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