Pandas Fillna 複数の列

Salman Mehmood 2023年6月21日
Pandas Fillna 複数の列

この記事では、fillna() 関数を使用して NaN 値を数値に置き換える方法について説明します。 Pandas データフレームの NaN 値を文字列に置き換える方法も学習します。

Pandas で fillna() を使用して NaN 値の複数の列を任意のデータ型に置き換える

Pandas の fillna() 関数は、NaN 値を指定された値に置き換えることができます。 この関数は、列または行内でこの値を伝播するか、列に基づいて NaN 値を別の値に置き換えることができます。

pd としてインポートされた Pandas ライブラリと、np としてインポートされた NumPy ライブラリが続く新しいスクリプトを作成します。 次に、City_Temp という新しいデータフレームを作成し、これを Pandas データフレームと等しくなるように設定します。

タルサとダラスの 2つの都市の気温を 1 週間追跡しているとしますが、データは不完全です。 各都市の 5 日間の気温値を含む 2 行のデータを作成します。

最初の行には Tulsa のキーといくつかの数値と np.nan がリスト内に含まれ、Dallas のキーを持つ 2 番目の行にはいくつかの数値と np.nan も含まれます。 np.nan 値は、データフレームに null 値を作成します。

次に、月曜から金曜までの省略名を含むリストを使用して index 引数を追加します。 結果がコンソールに出力されると、5 日間にわたる 2つの都市の温度値を含むデータフレームが表示されます。

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

City_Temp データフレーム内の空の値を埋めるには、print ステートメント内で Pandas の fillna() 関数を使用できます。 fillna() 関数では、単一の値 80.0 を追加します。結果がコンソールに出力されると、データフレームのすべての NaN 値が数値 80.0 に置き換えられていることがわかります。

print(City_Temp.fillna(80.0))

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    80.0
Thu   80.0    80.0
Fri   80.0    92.1

特定の値を提供する代わりに、値 ffillmethod 引数を使用して、関数に NaN 値を同じ列のその上の値で埋めるように指示することができます。 ここで、TulsaNaN 値は 75.1 に置き換えられ、Dallas の値は 93.1 に置き換えられます。

print(City_Temp.fillna(method="ffill"))

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1    93.1
Fri   75.1    92.1

同様に、method 引数の値が bfill に設定されている場合、バックフィルを実行できます。 結果は、Dallas 列の NaN 値が値 92.1 で埋められていることを示していますが、Tulsa 列の値は置き換えられていません。

これは、NaN 値を置き換えるために使用できる行 Friday の下に有効な値がないためです。

print(City_Temp.fillna(method="bfill"))

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    92.1
Thu    NaN    92.1
Fri    NaN    92.1

各都市のデータフレーム内の最初の NaN 要素の出現を埋めたい場合、method タイプに ffil 値を使用し、値 1 で limit 引数を追加できます。結果は、 NaN 値の最初の発生のみが順方向フィルに置き換えられます。

print(City_Temp.fillna(method="ffill", limit=1))

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1    93.1
Thu   75.1     NaN
Fri    NaN    92.1

NaN 要素を平均で埋める

最後に、異なる列の NaN 要素に異なる値を指定できます。

NaN 要素をその都市の平均気温値で埋めたいとしましょう。 これを行うには、fillna() 関数内で中括弧を使用して辞書を作成します。

ディクショナリに、np.mean() 関数を含む np.round() 関数を使用して、平均温度値を小数点以下 2 桁に丸めたキー Tulsa を追加します。

mean() 関数内で、City_Temp データフレームを最初の引数として追加し、角括弧内に Tulsa 列を指定し、その後に整数 2 を指定して、結果を小数点以下 2 桁に丸めます。 これは、Dallas キーと値のペアに対して繰り返されます。

永久に変更されるように、データフレームを再割り当てできます。

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

結果がコンソールに出力されると、木曜日と金曜日の NaN 要素がタルサの平均値 77.87 に置き換えられ、水曜日の NaN 要素がダラスの平均値 89.47 に置き換えられたことがわかります。 そして木曜日。

     Tulsa  Dallas
Mon  78.50   83.20
Tue  80.00   93.10
Wed  75.10   89.47
Thu  77.87   89.47
Fri  77.87   92.10

NaN 値を文字列に置き換える

あなたの場合、データ型は何でもかまいませんが、その場合、次のコードを使用して NaN 値または null 値を置き換えることもできます。

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

出力:

     Tulsa  Dallas
Mon   78.5    83.2
Tue   80.0    93.1
Wed   75.1     NaN
Thu    NaN     NaN
Fri    NaN    92.1

NaN 値を文字列に置き換える次のコードを検討してください。

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)

出力:

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

次のコード スニペットを使用して、NaN 値を文字列に置き換えることもできます。これは、上記のコードと同じように機能します。

print(City_Temp.fillna("."))

出力:

    Tulsa Dallas
Mon  78.5   83.2
Tue  80.0   93.1
Wed  75.1      .
Thu     .      .
Fri     .   92.1

完全なコード:

# In[1]:

import numpy as np
import pandas as pd

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)

print(City_Temp)

# In[2]:

print(City_Temp.fillna(80.0))

# In[3]:

print(City_Temp.fillna(method="ffill"))

# In[4]:

print(City_Temp.fillna(method="bfill"))

# In[5]:

print(City_Temp.fillna(method="ffill", limit=1))

# In[6]:

City_Temp = City_Temp.fillna(
    {
        "Tulsa": np.round(np.mean(City_Temp["Tulsa"]), 2),
        "Dallas": np.round(np.mean(City_Temp["Dallas"]), 2),
    }
)
print(City_Temp)

# ##### Replace nan with string

# In[7]:

City_Temp = pd.DataFrame(
    {
        "Tulsa": [78.5, 80.0, 75.1, np.nan, np.nan],
        "Dallas": [83.2, 93.1, np.nan, np.nan, 92.1],
    },
    index=["Mon", "Tue", "Wed", "Thu", "Fri"],
)
print(City_Temp)

# In[8]:

df = City_Temp.fillna({"Tulsa": ".", "Dallas": "."}).fillna(0)
print(df)
# In[9]:
print(City_Temp.fillna("."))

その他のソリューションについては、こちら を参照してください。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn

関連記事 - Pandas Column