pandas.DataFrameに列を追加/lambda/三項演算子|Python

1 アクセス

はじめに

この記事はPandasで愛知県の人口が多い市区町村順に並び替える|Pythonの続き

前回は、市区町村別人口のソートを行ったがこのデータは”郡市”と”区町村”で列が別れていた
今回は、”市区町村”という列を新しく追加する

この記事は、以下の著作物を改変して利用しています。
あいちの人口(2024年9月1日現在) 愛知県人口動向調査結果 月報、愛知県、クリエイティブ・コモンズ・ライセンス
表示2.1日本(http://creativecommons.org/licenses/by/2.1/jp/

サンプルコード

先に今回のコードを示す
前回同様、国籍や性別の区分、最新以外の人口には興味がないので、必要なデータのみを抽出している(詳細はこれまでの記事を参照)

import pandas as pd

# データの読み込みと抽出
df = pd.read_csv('population.csv', encoding='shift_jis')
df = df[(df["国籍区分"]=="a)日外") & (df["性別"]=="a)男女")]
df = df[["郡市", "区町村", "20240901"]]

# 市区町村列の作成
city = df.apply(lambda x : x["郡市"] if x["区町村"] == "―" else x["区町村"], axis = 1)

# dfに市区町村列を追加
df["市区町村"] = city

print(df)

関数を適用するapply()メソッド

DataFrameのapplyメソッドを用いることで行や列を関数に渡すことができる
第一引数に関数を指定する

デフォルトでは列が渡されるが、今回は行を渡したいのでaxis=1を指定している
これによって、xには各行が渡されていることになる(型はpandas.Series)

lambda(無名関数)

lambdaを用いることで、def で関数を定義することなく、名前を持たない関数を作成できる
applyメソッドのように、関数を引数に使うときに用いると便利そう

lambdaの形式は以下

lambda 第一引数, 第二引数, ...: 処理

今回は、引数はxの1個だけで、各行が渡されている
また、処理は三項演算子で書かれている

三項演算子

三項演算子を用いて、if文を1行で書く
形式は以下の通り

Trueの場合の返り値 if 条件式 else Falseの場合の返り値

つまり、lambdaと三項演算子を用いなければ以下の関数を定義するのと同じ

def hoge(x):
    if x["区町村"] == "―":
        return x["郡市"]
    else:
        return x["区町村"]

列の追加

dfに新しい列ラベルをつけて、pandas.Seriesを代入するだけ

追加するデータの型はlistやnumpy.ndarrayでも可

実行結果

      郡市  区町村   20240901   市町村
0      ―    ―  7465512.0     ―
1   名古屋市    ―  2330385.0  名古屋市
2   名古屋市  千種区   165413.0   千種区
3   名古屋市   東区    87931.0    東区
4   名古屋市   北区   161118.0    北区
..   ...  ...        ...   ...
66   知多郡  武豊町    43307.0   武豊町
67   額田郡  幸田町    42055.0   幸田町
68  北設楽郡  設楽町     3877.0   設楽町
69  北設楽郡  東栄町     2602.0   東栄町
70  北設楽郡  豊根村      896.0   豊根村

[71 rows x 4 columns]

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です