pandasの使用

データを読み込む

  • テーブル全体 = DataFrameと呼ぶ
  • テーブルの各行 = rowと呼ぶ
  • テーブルの各列 = columnと呼び、Seriesというデータに収まっている
import pandas as pd

df = pd.read_csv("./z-001.csv")
df.head()
Unnamed: 0Unnamed: 1平成21年度平成22年度平成23年度平成24年度平成25年度平成26年度平成27年度平成28年度平成29年度平成30年度令和元年度
02社会保障関係費29.831.232.732.731.832.833.734.434.634.434.7
13公債費18.920.319.820.920.921.421.320.620.920.620.0
24機関費11.912.511.710.611.811.711.811.411.511.911.8
35教育費11.711.911.712.111.611.711.711.711.811.811.9
46国土保全及び開発費12.011.310.610.210.910.59.910.410.510.510.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社会保障関係費2931323231323334343434
1公債費1820192020212120202020
2機関費1112111011111111111111
3教育費1111111211111111111111
4国土保全及び開発費121110101010910101010

データを絞り込む

# 平成21年度 > 15となるような行のみを抽出します
df.query("平成21年度 > 15")
列1平成21年度平成22年度平成23年度平成24年度平成25年度平成26年度平成27年度平成28年度平成29年度平成30年度令和元年度
0社会保障関係費2931323231323334343434
1公債費1820192020212120202020
# 平成21年度 > 10 & 平成22年度 < 15 となるような行のみを抽出します
df.query("平成21年度 > 10 & 平成22年度 < 15")
列1平成21年度平成22年度平成23年度平成24年度平成25年度平成26年度平成27年度平成28年度平成29年度平成30年度令和元年度
2機関費1112111011111111111111
3教育費1111111211111111111111
4国土保全及び開発費121110101010910101010

データの列ごとの統計量を算出する

# 数値の列のみに絞り込む
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年度令和元年度
min98987666666
max2931323231323334343434
median11.511.511.011.011.011.011.011.011.011.011.0
mean15.015.515.33333315.33333315.015.16666715.16666715.33333315.33333315.33333315.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]

列ごとの統計量を求める

ドキュメントにメソッドとプロパティの一覧が記載されている、minmaxなどを始めとして様々な計算を簡単に実行することができる。欠損が含まれているかどうかを示すプロパティも定義されている。

数値データ

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