びぼーろく。

広告業界のとある記憶力乏しき男の脳みそのバックアップ

 >> 備忘録一覧へ

【Pythonってなんだっけ?】 ExcelよりPandasだね。簡単な集計分析から可視化まで(前編)

PythonのライブラリであるPandasを使って、データを集計・分析・可視化する簡単な例を備忘録。
内容は基本的なものなので、初心者向けです。実に簡単に便利な集計を体験出来るかと思います。

前編ということで、データセット作成とその集計まで。
後編で分析や可視化をしていこうと思います。

Jupyter notebookでアウトプットもシェアしようかと思いましたが、前編は冗長になりそうでしたので、単純にスクリプトのみにしました。後編はJupyterでシェア出来れば良いなと思います。はてなブログに埋められるのか知りませんが。笑

以下長々続きますので、眺めるだけではつまらないと思いますがあしからず。。

import pandas as pd
import os

# --------------------------------- #
# 集計の下準備
# --------------------------------- #

# ターゲットファイルのパス
data = "C:/Users/xxx/data.tsv"

# 今回は以下のダミーファイルで。
data = "http://aima.cs.berkeley.edu/data/iris.csv"

# csvやtsvをdataframeとして読み込む。tsvの場合は", sep="\t""を追記。
df = pd.read_csv(data, index_col=None, header=None)

# 今回のダミーファイルにはカラム名が入っていないので、指定。
names = ['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species']
df.columns = names

# 重複のカット(特定列の指定も可能)
df = df.drop_duplicates()

# nullを含む行をカット(特定列の指定も可能)
df = df.dropna()

# カラム名称の文字列置換
df.rename(columns={'Sepal.Length': 'SLength', 'Sepal.Width': 'SWidth'})

# データの中身の文字列置換
df['Species'].replace('setosa', 'setosa2')

# ソート
df.sort_values(by=['Petal.Length', 'Petal.Width'], ascending = False)

# 行列逆転
df.T

# カラムの追加(dictionary形式でカテゴリカラムをコーディングする例)
category_code = {"setosa":1, "versicolor":2, "virginica":3}
df["Species_code"] = df["Species"].map(category_code)

# カラムの削除
del df['new_colmun']


# --------------------------------- #
# 集計
# --------------------------------- #

# DataFrameの情報
df.shape
df.info()

# 基本統計量
df.describe()

# 特定列のみ表示に絞込
df[['Petal.Length', 'Petal.Width']]

# 特定列の文字列に絞込
df[df["Species"] == "setosa"]

# 特定列の文字列・数値に絞込
df[(df["Species"] == "setosa") & (df["Sepal.Length"] >= 5)]

# グループ毎の集計。平均は".mean()"、カウントは".count()"、合計は".sum()"
df.groupby(["Species"]).mean()

# エクセルでお馴染みのピボット
df.pivot_table(['Sepal.Length', 'Petal.Length'], # データの中身
                index=['Species'], # 行
                columns=None, # 列
                aggfunc='sum',
                # aggfunc='count',
                # fill_value=0,
                margins=True) # 合計

# エクセルの関数みたいなもん。ここではラウンドの例。
df['Sepal.Length'].apply(lambda x: round(x , 0))

# dfの保存
df.to_csv('output.tsv', sep="\t", index=True)

# ちなみに消すなら
os.remove('output.tsv')

# --------------------------------- #
# Pandasの色々な併合
# --------------------------------- #

# 併合させるDataFrameを「right」とする

# 【横方向の連結・結合】
#  ・inner, outer, left, rightに対応
#   - (連結相手の)indexでの結合
#     ※dfのカラムを指定することも可能。on='Species',
df.join(right, how='outer', lsuffix="_left", rsuffix="_right")

#   - 特定カラムでの結合(複数カラムも可能)
#     ※カラム名違っても結合可能。left_on='left-key', right_on='right-key',
pd.merge(df, right, on=['Species'], how='left')

# 【縦方向の連結・結合】
#   ※1行(Series)での連結も可能(複数連結可能)
df.append([right], ignore_index=True)

以上、簡単な例文集でした。


【後編へ】
bbrk.hatenablog.com

 >> 備忘録一覧へ