Pandas入門

Pythonでデータ分析で利用されるPandasについて基本中の基本をまとめてみました。

準備

pandasをインポートします。

import pandas as pd

データフレーム

Pandasはデータフレームというものを使います。
2次元リスト(配列)を与えるだけです。

df=pd.DataFrame([[1,2,3],[4,5,6]])

結果

   0  1  2
0  1  2  3
1  4  5  6

見出しとインデックスを与えることもできます。

df=pd.DataFrame([[1,2,3],[4,5,6]],
  columns=["a","b","c"],
  index=["x","y"])

結果

   a  b  c
x  1  2  3
y  4  5  6

読み込み

CSVを読み込みます。
左端の列(0列目)が「2021/1/15」という文字列なので日付型に変換します。

filename = "sample.csv"
df = pd.read_csv(filename, sep=",", parse_dates=[0])

数値にカンマが付いているTSVの場合はsepとthousandsを指定します。

df = pd.read_csv(filename, sep="\t", thousands=',')

見出し

元の見出しは「日付,都道府県名,各地の感染者数_1日ごとの発表数,各地の死者数_1日ごとの発表数」で長いので、短い見出しに変えます。

df.columns = ["date", "pref", "infection", "death"]

ヘッダがないCSVの場合は見出しをつけることができます。

df = pd.read_csv(filename, header=None, names=["id", "datetime", "title", "status", "type"])

見出し(列)を絞ることができます。

df = df[["id", "title"]]

見出し(列)を削除できます。

df = df.drop(columns="title")

見出しはあるものの一部だけ見出しがない場合は次のようにします。これは左端の見出しがない場合です。見出しの変更もこれでできます。

df = df.rename(columns={df.columns[0]:"midashi"})

概要の出力

# 先頭部分と末尾部分が出力されます。
print(df)

# 表示する行数を指定できます。先頭部分と末尾部分を合わせて何行かを指定します。
pd.set_option('display.max_rows', 10)

# データフレームの先頭部分だけを出力します。引数に数値を入れると行数を指定できます。末尾はtail()です。
print(df.head())

# データフレームの形を出力します。
print(df.shape)

# データフレームのインデックスの状況を出力します。
print(df.index)

# データフレームの見出しを出力します。
print(df.columns)

# データフレームの見出しの詳細を出力します。
print(df.dtypes)

ソート

ソートします。デフォルトは昇順で、ascending=Falseとすると降順になります。

print(df.sort_values("death", ascending=False))

抽出

条件に合うものを抽出します。

print(df[(df["date"]=="2021-02-01") & (df["pref"]=="東京都")])
# キーワードを含む行を抽出します。
df=df[df["カラム"].str.contains("キーワード")]

# 「~」を使うとキーワードを含まない行を抽出します。
df=df[~df["カラム"].str.contains("キーワード")]

# 漢字を含む行を抽出します。正規表現が使えます。
df=df[df["カラム"].str.contains("[一-龠]")]

# 特定のカラムに欠損値を含む行を抽出します。
df=df[df["カラム"].isnull()]

# 特定のカラムに欠損値を含まない行を抽出します。
df=df[df["代表作"].notnull()]

# 欠損値を含む行を削除します。
df=df.dropna()

インデックスを指定して行を削除します。

df = df.drop(index="ターゲット")

特定の値だけを出力します。
次の例は特定のカラムの先頭行の値になります。

value = df["カラム"].values[0]

集計

日付毎に集計します。見出しを指定しないと計算できるものは全て集計します。

print(df.groupby(['date']).sum())

全国の死者数を日付毎に集計します。見出しを指定します。

result=df.groupby(['date'])["death"].sum()
print(result)

7日移動平均を出力します。

result_mean=result.rolling("7D").mean()
print(result_mean)

CSV出力

CSVで出力します。

result_mean.to_csv("7d.csv")

JSON

JSONファイルを読み込むことができます。

fn_json = "xxxxx.json"
df=pd.read_json(fn_json)

ファイル名をpandas.pyにするとエラーになります。

その他

見出しを絞る

見出しを絞ることができます。角括弧は二重にします。

df = df[["pref", "name"]]

HTMLテーブル

HTMLのテーブルに出力することができます。

import pandas as pd
filename = "test.csv"
df = pd.read_csv(filename, sep=",")
print(df)
df.to_html("table.htm", index = False)

転置

転置できます。

df = df.transpose()

列の追加

列を追加できます。下の例は平均を求め偏差の列を追加しています。

import pandas as pd
df = pd.DataFrame([377, 275, 233, 197, 162],
  index = ["横浜", "大阪", "名古屋", "札幌", "福岡"],
  columns = ["人口"])
mean = df["人口"].mean()
print("平均", mean)
df["偏差"] = df["人口"] - mean
print(df)

結果

平均 248.8
      人口     偏差
横浜   377  128.2
大阪   275   26.2
名古屋  233  -15.8
札幌   197  -51.8
福岡   162  -86.8

列を追加するケースの別のサンプルです。

単純に値を二倍にした列を追加します。

df = pd.DataFrame(
  [["apple", 10], ["banana", 15], ["carrot", 5]],
  columns = ["name", "value"])
df["double"] = df["value"] * 2
print(df)

結果

     name  value  double
0   apple     10      20
1  banana     15      30
2  carrot      5      10

flagという列を追加し、値がbananaの場合はyellow、それ以外はotherとします。
iterrowsを使いループで処理します。単純に追加できない場合はこの方法で行います。

df = pd.DataFrame(
  [["apple", 10], ["banana", 15], ["carrot", 5]],
  columns = ["name", "value"])
for index, row in df.iterrows():
  df.at[index, "flag"] = "yellow" if row["name"] == "banana" else "other"
print(df)

結果

     name  value    flag
0   apple     10   other
1  banana     15  yellow
2  carrot      5   other

8桁日付を日付に変換

「20240726」という文字列を「2024-07-26」という日付に変換します。
to_datetimeを使いますが引数は文字列である必要があります。

df["date"]=pd.to_datetime(df["date"].astype(str))

変化率

デフォルトは一つ前のレコードを比較します。
df[“price”].pct_change()
引数を入れるとどのレコードと比較するか指定できます。1だと一つ前、-1だと一つ後。
df[“price”].pct_change(1)
df[“price”].pct_change(-1)

diff()を使うと差になります。

コメント

タイトルとURLをコピーしました