pandasとエクセルの対応表(随時更新)

更新(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年の人口の多い順に並べ替え

```excel:エクセルの場合
「n180200200.xls」の10行～56行を選択
→リボンの「データ」押下
→並べ替え押下
→優先されるキーで「列B」と「降順」を選択
→OKを押下
```

```python:pandasの場合
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)
```
<details><summary>実行結果</summary><div>

|-|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
・・・

</div></details>

## フィルタ
### 数値フィルタ

- 人口密度が1000人以上を抽出

```excel:エクセルの場合
E9を選択
→「データ」リボンの「フィルター」押下
→フィルタで「数値フィルター」
→「指定の値以上」を選択
→1000を入力
→OKを押下
```

```python:pandasの場合
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]
```
※エクセルでは文字列がユーザ書式になっていました

<details><summary>実行結果</summary><div>

|-|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

</div></details>

### 文字列フィルタ
- 名前に山の漢字がある都道府県を抽出

```excel:エクセルの場合
A9を選択
→「データ」リボンの「フィルター」押下
→フィルタで検索ボックスに「山」を入力
→OKを押下
```

```python:pandasの場合
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df.loc[df[0].str.contains('山')]
```

<details><summary>実行結果</summary><div>

|-|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
</div></details>

## 関数
### sum
- B60に平成22年の都道府県の人口を合計

```excel:エクセルの場合
B60を選択する
→=sum(B10:B56)を入力
```

```python:pandasの場合
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()
```
<details><summary>実行結果</summary><div>

128054
</div></details>

### average
- B60に平成22年の都道府県の人口を平均する

```excel:エクセルの場合
B60を選択する
→=average(B10:B56)を入力
```

```python:pandasの場合
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()
```
<details><summary>実行結果</summary><div>
2724.553191489362
</div></details>

### max
- F60に人口増減率（平成22～27年）の最大

```excel:エクセルの場合
F60を選択する
→=max(F10:F56)を入力
```

```python:pandasの場合
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[5]=df[5].astype('float')
df[5].max()
```
<details><summary>実行結果</summary><div>
2.9
</div></details>

### min
- F60に人口増減率（平成22～27年）の最小

```excel:エクセルの場合
F60を選択する
→=min(F10:F56)を入力
```

```python:pandasの場合
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[5]=df[5].astype('float')
df[5].min()
```
<details><summary>実行結果</summary><div>
-5.8
</div></details>

### countif
- A60に山の字の入った都道府県の個数を数える

```excel:エクセルの場合
A60を選択する
→=COUNTIF(A10:A56,"*山*")を入力
```

```python:pandasの場合
import pandas as pd
df=pd.read_csv("n180200200.csv",header=None,encoding='shift-jis')
df[0].str.contains('山').sum()

```
<details><summary>実行結果</summary><div>
6
</div></details>

### sumif
- G60に山の字の入った都道府県の平成28年推計総人口の合計

```excel:エクセルの場合
G60を選択する
→=SUMIF(A10:A56,"*山*",G10:G56)を入力

```


```python:pandasの場合
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()

```
<details><summary>実行結果</summary><div>
7267
</div></details>

### if
- 22年と27年の人口を比べて27年が増えていたら、J列に"○"を表示する

```excel:エクセルの場合
J10を選択する
→=if(B10<C10,"○","")を入力
→J56までコピーする
```

```python:pandasの場合
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

```
<details><summary>実行結果</summary><div>

|-|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|○
</div></details>

## 参考

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