本記事の対象者
- Python初めて触るよ!
- pandasでいろいろ遊んでみたいよ!
- SeriesとDataFrame変換できないよ!
- groupbyとかcutとかわけわからん!
前提事項
本記事にて記載のコードは、以下をインポートしてる前提で書いてます。
import pandas as pd
Pandasとは
pandasは、Pythonでデータを扱う際に簡単にデータを扱うことができるライブラリだよ!
Series型とDataFrame型があるよ!
Seriesは一次元配列で、DataFrameは多次元配列だよ!
DataFrameに対して何か操作(groupbyとかcutとか)をすると、Series型で返却されることが多いよ!
まずはDataFrame作ろう
# csvから作る場合
csv_DataFrame = pd.read_csv("xxxx.csv")
# excelから作る場合
excel_DataFrame = pd.ExcelFile("xxxx.xlsx")
# 辞書から作る場合
dictionary_DataFrame = pd.DataFrame(
{'私':['I','my','me','mine'],
'あなた':['you','your','you','yours'],
'彼':['he','his','him','his'],
'彼女':['she','her','her','hers']},
columns = ['私','あなた','彼','彼女'])
# Seriesから作る場合
age = pd.Series([29, 24, 29, 10, 5, 0],
index=['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'])
sex = pd.Series(['m', 'm', 'm', 'f', 'f', 'f'],
index=['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'])
series_DataFrame = pd.DataFrame({'age': age, 'sex': sex}, columns=['age', 'sex'])
DataFrameを操作してみよう!
まずは簡単な操作から。
# 以下のDataFrameを作成
dictionary_DataFrame = pd.DataFrame(
{'私':['I','my','me','mine'],
'あなた':['you','your','you','yours'],
'彼':['he','his','him','his'],
'彼女':['she','her','her','hers']},
columns = ['私','あなた','彼','彼女'])
# 列の追加
dictionary_DataFrame['私達'] = ['we','our','us','ours']
# 行の追加は一回Seriesを作る
addRow = pd.Series(['myself','yourself','himself','herself','ourselves'], index = dictionary_DataFrame.columns)
dictionary_DataFrame.append(addRow, ignore_index = True)
# 列の抽出
dictionary_DataFrame[['私','彼']]
# 行の抽出(いろいろな方法があるがとりあえずこれだけ)
dictionary_DataFrame[0:3]
次に分割やグループ化。
返り値は全てSeries型
# 以下のDataFrameを作成
cdf = pd.DataFrame(
{'年代':['20','40','40','30','20','20','50'],
'支払金額':[100,200,300,400,500,600,700]},
columns = ['年代','支払金額'])
####実行結果####
### 年代 支払金額
### 0 20 100
### 1 40 200
### 2 40 300
### 3 30 400
### 4 20 500
### 5 20 600
### 6 50 700
# グループ化
# 年代がindexとなり、各年代に対する操作値を出力
# 年代ごとにグルーピングされ、支払金額に対して合計値を出力
cdf.groupby('年代')['支払金額'].sum()
# 年代ごとにグルーピングされ、支払金額に対して平均値を出力
cdf.groupby('年代')['支払金額'].mean()
# 年代ごとにグルーピングされ、支払金額に対して最大値を出力
cdf.groupby('年代')['支払金額'].max()
# 年代ごとにグルーピングされ、支払金額に対して最小値を出力
cdf.groupby('年代')['支払金額'].min()
####実行結果####
# sumの結果
# 年代
# 20 1200
# 30 400
# 40 500
# 50 700
# meanの結果
# 年代
# 20 400
# 30 400
# 40 250
# 50 700
# maxの結果
# 年代
# 20 600
# 30 400
# 40 300
# 50 700
# minの結果
# 年代
# 20 100
# 30 400
# 40 200
# 50 700
# 分割
# 年代がindexとなり、各年代に対する分割されたグルーピング先を出力
# 指定した範囲でデータを分割
pd.cut(cdf['支払金額'],[0,300,500,700])
# 値の大きさ順にn等分
pd.qcut(cdf['支払金額'],3)
#
####実行結果####
# cutの結果
# 0 (0, 300]
# 1 (0, 300]
# 2 (0, 300]
# 3 (300, 500]
# 4 (300, 500]
# 5 (500, 700]
# 6 (500, 700]
# qcutの結果
# 0 (99.999, 300.0]
# 1 (99.999, 300.0]
# 2 (99.999, 300.0]
# 3 (300.0, 500.0]
# 4 (300.0, 500.0]
# 5 (500.0, 700.0]
# 6 (500.0, 700.0]
分割とグループ化の応用。
分割した項目をkeyとして元のDataFrameに合体し、
再度その分類でグループ化する。
# 以下のDataFrameを作成
cdf = pd.DataFrame(
{'年代':['20','40','40','30','20','20','50'],
'支払金額':[100,200,300,400,500,600,700]},
columns = ['年代','支払金額'])
####実行結果####
### 年代 支払金額
### 0 20 100
### 1 40 200
### 2 40 300
### 3 30 400
### 4 20 500
### 5 20 600
### 6 50 700
# まずグループ化
cdf_sammary_group_series = cdf.groupby('年代')['支払金額'].sum()
####実行結果####
# sumの結果
# 年代
# 20 1200
# 30 400
# 40 500
# 50 700
# グループ化されたSeriesをDataFrameに変換
cdf_sammary_group_df = pd.DataFrame(cdf_sammary_group_series, columns = ['支払金額'])
# 分割し、groupbyに用いるkeyを作成。また、元のDataFrameに結合
cdf_sammary_group_df['key'] = pd.qcut(cdf_sammary_group_df['支払金額'], 2)
####実行結果####
# 支払金額 key
# 年代
# 20 1200 (600.0, 1200.0]
# 30 400 (399.999, 600.0]
# 40 500 (399.999, 600.0]
# 50 700 (600.0, 1200.0]
# 作成したkeyを元に、各分割グループの操作
sum = cdf_sammary_group_df.groupby('key').sum()
max = cdf_sammary_group_df.groupby('key').max()
min = cdf_sammary_group_df.groupby('key').min()
####実行結果####
# sumの結果
# 支払金額
# key
# (399.999, 600.0] 900
# (600.0, 1200.0] 1900
# maxの結果
# 支払金額
# key
# (399.999, 600.0] 500
# (600.0, 1200.0] 1200
# minの結果
# 支払金額
# key
# (399.999, 600.0] 400
# (600.0, 1200.0] 700
最後に今回のおさらい
pandasっていうのは、Pythonでデータ型を扱う上で便利なライブラリだよ!
Seriesっていう一次元配列型と、DataFrameっていう多次元配列型があるよ!
DataFrameを作っておけば、sqlでよくやる操作ができちゃうよ!
勉強が進んだら、もっと掘り下げて書いてみます。