更新(2018/11/21)
- フィルターに文字列を追加
pandasの勉強を始めたばかりなのですが、下記を見た時にPyCon JP 2018 Tutorial の「Pythonを用いたデータ分析入門」で
「エクセルで出来ることは全部Pandasでできる」
と言われたのを思い出したのを機に作ってみました
自分がよく使うものを中心に基本的なものばかりです
SQL と Pandas の対応表
https://qiita.com/takaiyuk/items/5232442eaeb01299b265
準備
使用データ
下記のデータを使います
総務省統計局
https://www.stat.go.jp/data/nihon/02.html
第2章 人口・世帯
2- 2 都道府県別人口と人口増減率(エクセル:34KB)
https://www.stat.go.jp/data/nihon/zuhyou/n180200200.xls
ちょっと加工
エクセルを開いて北海道~沖縄以外の行を消してcsvで保存します
(ファイル名はn180200200.csvとします)
※xlrdのインストールをしていません
データの説明
北海道から沖縄までの人口データのファイルです
項目は下記となっています
No | 列 | 項目 |
---|---|---|
0 | A列 | 都道府県名 |
1 | B列 | 平成22年人口(千人) |
2 | C列 | 平成27年人口(千人) |
3 | D列 | 人口集中地区 |
4 | E列 | 人口密度 |
5 | F列 | 人口増減率(平成22~27年) |
6 | G列 | 平成28年推計総人口 |
7 | H列 | 平成28年推計人口性比(女性100に対する男性) |
8 | I列 | 平成28年推計人口増減率(対前年)(人口1,000につき) |
使用環境
python3.5
jupyter notebook
基本的なもの
並べ替え
- 平成27年の人口の多い順に並べ替え
「n180200200.xls」の10行~56行を選択
→リボンの「データ」押下
→並べ替え押下
→優先されるキーで「列B」と「降順」を選択
→OKを押下
import pandas as pd
df=pd.read_csv("n180200200.csv", encoding="shift-jis", header=None)
#カンマを削除
df[2]=df[2].str.replace(',', '')
#型変換しないと文字列でソートされます
df[2]=df[2].astype('int')
df.sort_values(2,ascending=False)
・・・実行結果
-
0
1
2
3
4
5
6
7
8
12
東京
13,159
13515
13,295
6,168.7
2.7
13,624
97.2
8.0
13
神奈川
9,048
9126
8,616
3,777.7
0.9
9,145
99.7
2.0
26
大阪
8,865
8839
8,456
4,639.8
-0.3
8,833
92.7
-0.8
22
愛知
7,411
7483
5,802
1,446.7
1.0
7,507
100.1
3.2
10
埼玉
7,195
7267
5,828
1,913.4
1.0
7,289
99.7
3.2
11
千葉
6,216
6223
4,622
1,206.5
0.1
6,236
98.8
2.1
27
兵庫
5,588
5535
4,299
658.8
-1.0
5,520
91.2
-2.7
0
北海道
5,506
5382
4,047
a)68.6
-2.3
5,352
89.1
-5.6
フィルタ
数値フィルタ
- 人口密度が1000人以上を抽出
E9を選択
→「データ」リボンの「フィルター」押下
→フィルタで「数値フィルター」
→「指定の値以上」を選択
→1000を入力
→OKを押下
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
#カンマを削除
df[4]=df[4].str.replace(',','')
#先頭から数字以外で始まる文字を削除
df[4]=df[4].str.replace('^[^1-9]+','')
df[4]=df[4].astype('float')
df.loc[df[4] > 1000]
※エクセルでは文字列がユーザ書式になっていました
実行結果
-
0
1
2
3
4
5
6
7
8
10
埼玉
7,195
7,267
5,828
1913.4
1.0
7,289
99.7
3.2
11
千葉
6,216
6,223
4,622
1206.5
0.1
6,236
98.8
2.1
12
東京
13,159
13,515
13,295
6168.7
2.7
13,624
97.2
8.0
13
神奈川
9,048
9,126
8,616
3777.7
0.9
9,145
99.7
2.0
22
愛知
7,411
7,483
5,802
1446.7
1.0
7,507
100.1
3.2
26
大阪
8,865
8,839
8,456
4639.8
-0.3
8,833
92.7
-0.8
39
福岡
5,072
5,102
3,693
1023.1
0.6
5,104
89.6
0.6
文字列フィルタ
- 名前に山の漢字がある都道府県を抽出
A9を選択
→「データ」リボンの「フィルター」押下
→フィルタで検索ボックスに「山」を入力
→OKを押下
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df.loc[df[0].str.contains('山')]
実行結果
-
0
1
2
3
4
5
6
7
8
5
山形
1,169
1,124
491
120.5
-3.9
1,113
92.7
-9.6
15
富山
1,093
1,066
403
251.0
-2.5
1,061
93.7
-4.7
18
山梨
863
835
261
187.0
-3.3
830
95.8
-6.3
29
和歌山
1,002
964
359
203.9
-3.9
954
88.8
-9.9
32
岡山
1,945
1,922
897
270.1
-1.2
1,915
92.3
-3.6
34
山口
1,451
1,405
691
229.8
-3.2
1,394
90.0
-7.4
関数
sum
- B60に平成22年の都道府県の人口を合計
B60を選択する
→=sum(B10:B56)を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
#カンマを削除、型変換
df[1]=df[1].str.replace(',','')
df[1]=df[1].astype('int')
df[1].sum()
128054実行結果
average
- B60に平成22年の都道府県の人口を平均する
B60を選択する
→=average(B10:B56)を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
#カンマを削除、型変換
df[1]=df[1].str.replace(',','')
df[1]=df[1].astype('int')
df[1].mean()
実行結果
2724.553191489362
max
- F60に人口増減率(平成22~27年)の最大
F60を選択する
→=max(F10:F56)を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[5]=df[5].astype('float')
df[5].max()
実行結果
2.9
min
- F60に人口増減率(平成22~27年)の最小
F60を選択する
→=min(F10:F56)を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[5]=df[5].astype('float')
df[5].min()
実行結果
-5.8
countif
- A60に山の字の入った都道府県の個数を数える
A60を選択する
→=COUNTIF(A10:A56,"*山*")を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[0].str.contains('山').sum()
実行結果
6
sumif
- G60に山の字の入った都道府県の平成28年推計総人口の合計
G60を選択する
→=SUMIF(A10:A56,"*山*",G10:G56)を入力
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[6]=df[6].str.replace(',','')
df[6]=df[6].astype('int')
(df.loc[df[0].str.contains('山')])[6].sum()
実行結果
7267
if
- 22年と27年の人口を比べて27年が増えていたら、J列に"○"を表示する
J10を選択する
→=if(B10<C10,"○","")を入力
→J56までコピーする
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[1]=df[1].str.replace(',','')
df[1]=df[1].astype('int')
df[2]=df[2].str.replace(',','')
df[2]=df[2].astype('int')
df[9]=""
df.loc[df[1]<df[2],9]="○"
df
実行結果
-
0
1
2
3
4
5
6
7
8
9
0
北海道
5506
5382
4,047
a)68.6
-2.3
5,352
89.1
-5.6
1
青森
1373
1308
610
135.6
-4.7
1,293
88.6
-11.3
2
岩手
1330
1280
408
83.8
-3.8
1,268
92.8
-9.1
3
宮城
2348
2334
1,495
320.5
-0.6
2,330
95.6
-1.6
4
秋田
1086
1023
358
87.9
-5.8
1,010
88.5
-13.0
5
山形
1169
1124
491
120.5
-3.9
1,113
92.7
-9.6
6
福島
2029
1914
816
138.9
-5.7
1,901
97.9
-6.9
7
茨城
2970
2917
1,113
478.4
-1.8
2,905
99.4
-4.2
8
栃木
2008
1974
892
308.1
-1.7
1,966
98.9
-4.2
9
群馬
2008
1973
788
310.1
-1.7
1,967
97.5
-3.0
10
埼玉
7195
7267
5,828
1,913.4
1.0
7,289
99.7
3.2
○
11
千葉
6216
6223
4,622
1,206.5
0.1
6,236
98.8
2.1
○
12
東京
13159
13515
13,295
6,168.7
2.7
13,624
97.2
8.0
○
13
神奈川
9048
9126
8,616
3,777.7
0.9
9,145
99.7
2.0
○
14
新潟
2374
2304
1,121
183.1
-3.0
2,286
93.9
-8.0
15
富山
1093
1066
403
251.0
-2.5
1,061
93.7
-4.7
16
石川
1170
1154
594
275.7
-1.3
1,151
93.9
-2.7
17
福井
806
787
346
187.7
-2.4
782
94.2
-5.5
18
山梨
863
835
261
187.0
-3.3
830
95.8
-6.3
19
長野
2152
2099
719
154.8
-2.5
2,088
95.0
-5.1
20
岐阜
2081
2032
776
191.3
-2.3
2,022
93.9
-4.9
21
静岡
3765
3700
2,216
475.8
-1.7
3,688
96.9
-3.4
22
愛知
7411
7483
5,802
1,446.7
1.0
7,507
100.1
3.2
○
23
三重
1855
1816
789
314.5
-2.1
1,808
94.9
-4.2
24
滋賀
1411
1413
702
351.7
0.2
1,413
97.3
-0.1
○
25
京都
2636
2610
2,181
566.0
-1.0
2,605
91.7
-1.9
26
大阪
8865
8839
8,456
4,639.8
-0.3
8,833
92.7
-0.8
27
兵庫
5588
5535
4,299
658.8
-1.0
5,520
91.2
-2.7
28
奈良
1401
1364
884
369.6
-2.6
1,356
89.2
-5.9
29
和歌山
1002
964
359
203.9
-3.9
954
88.8
-9.9
30
鳥取
589
573
212
163.5
-2.6
570
91.3
-6.8
31
島根
717
694
168
103.5
-3.2
690
92.5
-6.4
32
岡山
1945
1922
897
270.1
-1.2
1,915
92.3
-3.6
33
広島
2861
2844
1,834
335.4
-0.6
2,837
94.0
-2.3
34
山口
1451
1405
691
229.8
-3.2
1,394
90.0
-7.4
35
徳島
785
756
247
182.3
-3.8
750
91.0
-7.4
36
香川
996
976
318
520.2
-2.0
972
93.8
-4.3
37
愛媛
1431
1385
733
244.1
-3.2
1,375
89.6
-7.5
38
高知
764
728
317
102.5
-4.7
721
88.9
-10.0
39
福岡
5072
5102
3,693
1,023.1
0.6
5,104
89.6
0.6
○
40
佐賀
850
833
262
341.2
-2.0
828
89.5
-5.4
41
長崎
1427
1377
661
333.3
-3.5
1,367
88.6
-7.5
42
熊本
1817
1786
854
241.1
-1.7
1,774
89.1
-6.7
43
大分
1197
1166
551
183.9
-2.5
1,160
89.9
-5.7
44
宮崎
1135
1104
509
142.7
-2.7
1,096
88.8
-7.2
45
鹿児島
1706
1648
663
179.4
-3.4
1,637
88.4
-6.6
46
沖縄
1393
1434
972
628.4
2.9
1,439
96.7
4.0
○
参考
pandasのDataFrameのデータ操作をよくわすれるので、よく使用する操作を自分のためにまとめた
https://qiita.com/kakiuchis/items/46ff158295686c0c71cf
pythonのdataframe カラム毎にまるごと型変換
https://qiita.com/nkam/items/e6e0feca70fda8fec2b1
pandasの文字列メソッドで置換や空白削除などの処理を行う
https://note.nkmk.me/python-pandas-str-replace-strip-etc/
Pandasで不要な文字を取り除いたり置換する方法まとめ
https://deepage.net/features/pandas-str-replace.html
Markdown記法 チートシート
https://qiita.com/Qiita/items/c686397e4a0f4f11683d
Python Pandasでのデータ操作の初歩まとめ − 後半:データ集計編
https://qiita.com/hik0107/items/0ae69131e5317b62c3b7
Pandasでデータ集計をする際に最低限覚えておきたいメソッド
https://qiita.com/kyo-bad/items/f5ddb7e4b8e7ad9103c5