pandasのDataFrameで条件の否定を指定する(~で否定を表す)

pandas の DataFrame から特定の行を除く方法。今回はあるカラム名の要素が「〜で終わっている」という条件を満たす行を除いてみる。

結論

条件指定に ~ をつける。

df2 = df.loc[~df[‘市区町村名’].str.endswith(‘区’)]

説明

扱うデータは宮城県の自治体別人口で、出展は総務省統計局である。まずは pandas で csv ファイルを読みこむ。これは read_csv を使う。

import pandas as pd

df = pd.read_csv(‘宮城県.csv’)

次のデータが読みこまれる。

市区町村名 人口
0 仙台市計 1,060,545
1 仙台市青葉区 292,649
2 仙台市宮城野区 189,777
3 仙台市若林区 134,919
4 仙台市太白区 228,310
5 仙台市泉区 214,890
6 石巻 146,162
7 塩竈 54,873
8 気仙沼 64,947
9 白石 34,718
10 名取 78,460
11 角田 29,713
12 多賀城 62,474
13 岩沼 44,221
14 登米 81,094
15 栗原 69,382
16 東松島 40,247
17 大崎 132,321
18 富谷 52,635

出展
総務省統計局 - 人口・世帯

きちんと pandas の DataFrame が出力された。次に、データから仙台市青葉区などの区を除く。

import pandas as pd

df = pd.read_csv(‘宮城県.csv’)
df2 = df.loc[~df[‘市区町村名’].str.endswith(‘区’)]

結果はこうなる。

市区町村名 人口
0 仙台市計 1,060,545
6 石巻 146,162
7 塩竈 54,873
8 気仙沼 64,947
9 白石 34,718
10 名取 78,460
11 角田 29,713
12 多賀城 62,474
13 岩沼 44,221
14 登米 81,094
15 栗原 69,382
16 東松島 40,247
17 大崎 132,321
18 富谷 52,635

「区」の行だけが除かれた。ポイントは ~ という記号で、これは loc 条件の否定にあたる。つけないとどうなるか?

市区町村名 人口
1 仙台市青葉区 292,649
2 仙台市宮城野区 189,777
3 仙台市若林区 134,919
4 仙台市太白区 228,310
5 仙台市泉区 214,890

区のつく行だけが出力された。

今回は pandas の endswith を使って行を抽出した。文字列の条件指定は pandas の強力な道具である。

pandasの条件にendswithやstartswithなどを指定する