pandas
python3
DataFrame
series

Pythonにおけるデータ操作系のライブラリをさっくり紹介する

本記事の対象者

  • 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でよくやる操作ができちゃうよ!

勉強が進んだら、もっと掘り下げて書いてみます。