In [1]: import pandas as pd
このチュートリアルで使用するデータ
  • このチュートリアルでは、OpenAQ が提供し、py-openaq パッケージを使用して取得した、\(NO_2\) に関する大気質データを使用します。air_quality_no2.csv データセットは、パリの FR04014、アントワープの BETR801、ロンドンの London Westminster の測定ステーションにおける \(NO_2\) 値を提供します。

    生データへ
    In [2]: air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True)
    
    In [3]: air_quality.head()
    Out[3]: 
                         station_antwerp  station_paris  station_london
    datetime                                                           
    2019-05-07 02:00:00              NaN            NaN            23.0
    2019-05-07 03:00:00             50.5           25.0            19.0
    2019-05-07 04:00:00             45.0           27.7            19.0
    2019-05-07 05:00:00              NaN           50.4            16.0
    2019-05-07 06:00:00              NaN           61.9             NaN
    

既存の列から派生した新しい列を作成する方法#

../../_images/05_newcolumn_1.svg
  • ロンドンのステーションの \(NO_2\) 濃度を mg/m\(^3\) で表現したいです。

    気温25℃、気圧1013hPaと仮定すると、換算係数は1.882です

    In [4]: air_quality["london_mg_per_cubic"] = air_quality["station_london"] * 1.882
    
    In [5]: air_quality.head()
    Out[5]: 
                         station_antwerp  ...  london_mg_per_cubic
    datetime                              ...                     
    2019-05-07 02:00:00              NaN  ...               43.286
    2019-05-07 03:00:00             50.5  ...               35.758
    2019-05-07 04:00:00             45.0  ...               35.758
    2019-05-07 05:00:00              NaN  ...               30.112
    2019-05-07 06:00:00              NaN  ...                  NaN
    
    [5 rows x 4 columns]
    

    新しい列を作成するには、代入文の左側に新しい列名を持つ [] 角括弧を使用します。

値の計算は要素ごとに行われます。これは、与えられた列のすべての値が一度に1.882という値で乗算されることを意味します。各行を反復処理するためにループを使用する必要はありません!

../../_images/05_newcolumn_2.svg
  • パリとアントワープの値の比率をチェックし、その結果を新しい列に保存したいです。

    In [6]: air_quality["ratio_paris_antwerp"] = (
       ...:     air_quality["station_paris"] / air_quality["station_antwerp"]
       ...: )
       ...: 
    
    In [7]: air_quality.head()
    Out[7]: 
                         station_antwerp  ...  ratio_paris_antwerp
    datetime                              ...                     
    2019-05-07 02:00:00              NaN  ...                  NaN
    2019-05-07 03:00:00             50.5  ...             0.495050
    2019-05-07 04:00:00             45.0  ...             0.615556
    2019-05-07 05:00:00              NaN  ...                  NaN
    2019-05-07 06:00:00              NaN  ...                  NaN
    
    [5 rows x 5 columns]
    

    計算は再度要素ごとに行われるため、/各行の値に対して適用されます。

他の数学演算子 (+, -, *, /,...) や論理演算子 (<, >, ==,...) も要素ごとに機能します。後者は、条件式を使用してテーブルの行をフィルタリングするために、データのサブセットチュートリアルで既に使用されています。

より高度なロジックが必要な場合は、apply() を介して任意のPythonコードを使用できます。

  • OpenAQ が使用する対応するステーション識別子にデータ列の名前を変更したいです。

    In [8]: air_quality_renamed = air_quality.rename(
       ...:     columns={
       ...:         "station_antwerp": "BETR801",
       ...:         "station_paris": "FR04014",
       ...:         "station_london": "London Westminster",
       ...:     }
       ...: )
       ...: 
    
    In [9]: air_quality_renamed.head()
    Out[9]: 
                         BETR801  FR04014  ...  london_mg_per_cubic  ratio_paris_antwerp
    datetime                               ...                                          
    2019-05-07 02:00:00      NaN      NaN  ...               43.286                  NaN
    2019-05-07 03:00:00     50.5     25.0  ...               35.758             0.495050
    2019-05-07 04:00:00     45.0     27.7  ...               35.758             0.615556
    2019-05-07 05:00:00      NaN     50.4  ...               30.112                  NaN
    2019-05-07 06:00:00      NaN     61.9  ...                  NaN                  NaN
    
    [5 rows x 5 columns]
    

    rename() 関数は、行ラベルと列ラベルの両方に使用できます。現在の名前をキーとし、新しい名前を値とする辞書を指定して、対応する名前を更新します。

マッピングは固定名に限定されず、マッピング関数でもかまいません。たとえば、列名を小文字に変換することも関数を使って実行できます。

In [10]: air_quality_renamed = air_quality_renamed.rename(columns=str.lower)

In [11]: air_quality_renamed.head()
Out[11]: 
                     betr801  fr04014  ...  london_mg_per_cubic  ratio_paris_antwerp
datetime                               ...                                          
2019-05-07 02:00:00      NaN      NaN  ...               43.286                  NaN
2019-05-07 03:00:00     50.5     25.0  ...               35.758             0.495050
2019-05-07 04:00:00     45.0     27.7  ...               35.758             0.615556
2019-05-07 05:00:00      NaN     50.4  ...               30.112                  NaN
2019-05-07 06:00:00      NaN     61.9  ...                  NaN                  NaN

[5 rows x 5 columns]
ユーザーガイドへ

列または行ラベルの名前変更に関する詳細は、ユーザーガイドのラベルの名前変更のセクションで提供されています。

覚えておいてください

  • [] の間に新しい列名を指定して、DataFrameに出力を割り当てることで新しい列を作成します。

  • 操作は要素ごとに行われるため、行をループする必要はありません。

  • 行ラベルまたは列名を変更するには、辞書または関数を使用して rename を使用します。

ユーザーガイドへ

ユーザーガイドには、列の追加と削除に関する別のセクションが含まれています。