更新(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()
実行結果
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()
実行結果
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()
実行結果
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()
実行結果
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()
実行結果
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