pandasの使用
データを読み込む
- テーブル全体 = DataFrameと呼ぶ
- テーブルの各行 = rowと呼ぶ
- テーブルの各列 = columnと呼び、Seriesというデータに収まっている
import pandas as pd
df = pd.read_csv("./z-001.csv")
df.head()
| Unnamed: 0 | Unnamed: 1 | 平成21年度 | 平成22年度 | 平成23年度 | 平成24年度 | 平成25年度 | 平成26年度 | 平成27年度 | 平成28年度 | 平成29年度 | 平成30年度 | 令和元年度 |
---|
0 | 2 | 社会保障関係費 | 29.8 | 31.2 | 32.7 | 32.7 | 31.8 | 32.8 | 33.7 | 34.4 | 34.6 | 34.4 | 34.7 |
---|
1 | 3 | 公債費 | 18.9 | 20.3 | 19.8 | 20.9 | 20.9 | 21.4 | 21.3 | 20.6 | 20.9 | 20.6 | 20.0 |
---|
2 | 4 | 機関費 | 11.9 | 12.5 | 11.7 | 10.6 | 11.8 | 11.7 | 11.8 | 11.4 | 11.5 | 11.9 | 11.8 |
---|
3 | 5 | 教育費 | 11.7 | 11.9 | 11.7 | 12.1 | 11.6 | 11.7 | 11.7 | 11.7 | 11.8 | 11.8 | 11.9 |
---|
4 | 6 | 国土保全及び開発費 | 12.0 | 11.3 | 10.6 | 10.2 | 10.9 | 10.5 | 9.9 | 10.4 | 10.5 | 10.5 | 10.8 |
---|
データを整形する
列名の変更・重複の除去・型の変更・欠損の置き換えなどを実行する。データ全体の欠損を置き換えたり、データの各列・行ごとに一括で統計量を求めるメソッドが用意されている。
pandas.DataFrame.mad
pandas.DataFrame.max
pandas.DataFrame.mean
pandas.DataFrame.median
pandas.DataFrame.min
pandas.DataFrame.mode
欠損や余分なデータへの対応
df = df.fillna(0) # 欠損を0に置き換え
df = df.drop(["Unnamed: 0"], axis=1) # 'Unnamed: 0'列を削除
df.columns = df.columns.str.replace("Unnamed: ", "列") # 列名の Unnamed を別の文字列に置換
df = df.applymap(
lambda x: int(x) if type(x) == float else x
) # 数値データならば全て整数にするような関数を全体に適用する
df.head()
| 列1 | 平成21年度 | 平成22年度 | 平成23年度 | 平成24年度 | 平成25年度 | 平成26年度 | 平成27年度 | 平成28年度 | 平成29年度 | 平成30年度 | 令和元年度 |
---|
0 | 社会保障関係費 | 29 | 31 | 32 | 32 | 31 | 32 | 33 | 34 | 34 | 34 | 34 |
---|
1 | 公債費 | 18 | 20 | 19 | 20 | 20 | 21 | 21 | 20 | 20 | 20 | 20 |
---|
2 | 機関費 | 11 | 12 | 11 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
---|
3 | 教育費 | 11 | 11 | 11 | 12 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
---|
4 | 国土保全及び開発費 | 12 | 11 | 10 | 10 | 10 | 10 | 9 | 10 | 10 | 10 | 10 |
---|
データを絞り込む
# 平成21年度 > 15となるような行のみを抽出します
df.query("平成21年度 > 15")
| 列1 | 平成21年度 | 平成22年度 | 平成23年度 | 平成24年度 | 平成25年度 | 平成26年度 | 平成27年度 | 平成28年度 | 平成29年度 | 平成30年度 | 令和元年度 |
---|
0 | 社会保障関係費 | 29 | 31 | 32 | 32 | 31 | 32 | 33 | 34 | 34 | 34 | 34 |
---|
1 | 公債費 | 18 | 20 | 19 | 20 | 20 | 21 | 21 | 20 | 20 | 20 | 20 |
---|
# 平成21年度 > 10 & 平成22年度 < 15 となるような行のみを抽出します
df.query("平成21年度 > 10 & 平成22年度 < 15")
| 列1 | 平成21年度 | 平成22年度 | 平成23年度 | 平成24年度 | 平成25年度 | 平成26年度 | 平成27年度 | 平成28年度 | 平成29年度 | 平成30年度 | 令和元年度 |
---|
2 | 機関費 | 11 | 12 | 11 | 10 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
---|
3 | 教育費 | 11 | 11 | 11 | 12 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
---|
4 | 国土保全及び開発費 | 12 | 11 | 10 | 10 | 10 | 10 | 9 | 10 | 10 | 10 | 10 |
---|
データの列ごとの統計量を算出する
# 数値の列のみに絞り込む
df_num = df.select_dtypes("number")
# 列をリストにする関数
def concat_str(series: pd.Series) -> list:
"""列に含まれるデータをリストにする"""
return [s for s in series]
# 列ごとの統計量を求める、指定した関数にデータを渡して実行することもできる
df_num.agg(["min", "max", "median", "mean", concat_str])
| 平成21年度 | 平成22年度 | 平成23年度 | 平成24年度 | 平成25年度 | 平成26年度 | 平成27年度 | 平成28年度 | 平成29年度 | 平成30年度 | 令和元年度 |
---|
min | 9 | 8 | 9 | 8 | 7 | 6 | 6 | 6 | 6 | 6 | 6 |
---|
max | 29 | 31 | 32 | 32 | 31 | 32 | 33 | 34 | 34 | 34 | 34 |
---|
median | 11.5 | 11.5 | 11.0 | 11.0 | 11.0 | 11.0 | 11.0 | 11.0 | 11.0 | 11.0 | 11.0 |
---|
mean | 15.0 | 15.5 | 15.333333 | 15.333333 | 15.0 | 15.166667 | 15.166667 | 15.333333 | 15.333333 | 15.333333 | 15.333333 |
---|
concat_str | [29, 18, 11, 11, 12, 9] | [31, 20, 12, 11, 11, 8] | [32, 19, 11, 11, 10, 9] | [32, 20, 10, 12, 10, 8] | [31, 20, 11, 11, 10, 7] | [32, 21, 11, 11, 10, 6] | [33, 21, 11, 11, 9, 6] | [34, 20, 11, 11, 10, 6] | [34, 20, 11, 11, 10, 6] | [34, 20, 11, 11, 10, 6] | [34, 20, 11, 11, 10, 6] |
---|
列ごとの統計量を求める
ドキュメントにメソッドとプロパティの一覧が記載されている、
min
や
max
などを始めとして様々な計算を簡単に実行することができる。欠損が含まれているかどうかを示すプロパティも定義されている。
数値データ
平成21年の列 = df["平成21年度"]
print(平成21年の列)
0 29
1 18
2 11
3 11
4 12
5 9
Name: 平成21年度, dtype: int64
print(f" min: {平成21年の列.min()}")
print(f" max: {平成21年の列.max()}")
print(f" median: {平成21年の列.median()}")
print(f" dtypes(データ型): {平成21年の列.dtypes}")
print(f" hasnans(欠損の有無): {平成21年の列.hasnans}")
min: 9
max: 29
median: 11.5
dtypes(データ型): int64
hasnans(欠損の有無): False
文字列データ
文字列の出現回数を求めてみます。出現回数を知るには value_counts
を使います。
もしも文字列に対すしてどのような操作が用意されているか忘れてしまった場合やまったく見当がつかない場合、ドキュメントを調べることで見つけることができます。たとえば文字列の出現回数を知りたい時はドキュメントで「count value」などと検索すれば、
- Categorical data
- How to calculate summary statistics?
- pandas.DataFrame.count
- pandas.Series.count
などのページが出てきます。そして、pandas.DataFrame.countなどを見れば
『See also(こちらもご覧ください)』の欄にDataFrame.value_counts
へのリンクがあります。value_counts
でドキュメントを検索すれば pandas.Series.value_countsが見つかり、これを使えば文字列の出現回数を求められることが分かります。
df["平成21年度"].value_counts()
11 2
29 1
18 1
12 1
9 1
Name: 平成21年度, dtype: int64