Pandas入門

Pocket

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


目次


準備

pandasをインポートします。
またグラフを描くためmatplotlibもインポートします。

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

データフレーム

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="ターゲット")

集計

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

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

グラフ

Pandasでは簡単なグラフを複雑な設定なしで描画できます。

result_mean.plot()
plt.show()

棒グラフと散布図と円グラフ

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
df = pd.DataFrame([[377, 438], [275, 225], [233, 327], [197, 1121], [162, 343]],
index = ["横浜", "大阪", "名古屋", "札幌", "福岡"],
columns = ["人口", "面積"])

# 棒グラフ
df.plot.bar()
plt.show()

# 散布図
df.plot.scatter(x="人口", y="面積")
plt.xlabel("人口")
plt.ylabel("面積")
plt.show()

# 円グラフ
df["人口"].plot.pie()
plt.show()

JSON

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

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

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

その他

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

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

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

[ 2021年2月8日 | カテゴリー: Python, デジタル | タグ: , ]

« | »

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

送信してください。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報