このNotebookについて

2015年07月23日(木)に開催された、「Pythonエンジニア養成読本」読書会 03 - connpassの登壇時、追加資料として利用したものです。

Author: Takahiro Ikeuchi - @iktakahiro


In [3]:
import pandas as pd
import numpy as np

データの結合(JOIN)

養成読本では、複数のデータソースを組み合わせて利用する例は示しませんでした。データの結合(JOIN)について解説します。


In [9]:
# 商品データと購買ログの2つのデータを読み込みます。
master = pd.read_csv('./data/master.csv')
log = pd.read_csv('./data/log.csv')

In [7]:
# masterの内容を確認します
master


Out[7]:
id name price
0 i100 ham 230
1 i200 egg 150
2 i300 bacon 170

In [136]:
# logの内容を確認します
log


Out[136]:
date user id
0 2015-07-01 u100 i100
1 2015-07-01 u100 i200
2 2015-07-02 u100 i100
3 2015-07-03 u200 i300
4 2015-07-03 u200 i100
5 2015-07-03 u300 i200
6 2015-07-03 u300 i100

データの結合を行います。


In [137]:
# id 列で結合します
pd.merge(log, master, left_on='id', right_on='id')


Out[137]:
date user id name price
0 2015-07-01 u100 i100 ham 230
1 2015-07-02 u100 i100 ham 230
2 2015-07-03 u200 i100 ham 230
3 2015-07-03 u300 i100 ham 230
4 2015-07-01 u100 i200 egg 150
5 2015-07-03 u300 i200 egg 150
6 2015-07-03 u200 i300 bacon 170

pipe() の解説

Pandas 0.16.2 で、 pipe() というメソッドが追加されました。pipe() について解説します。


In [5]:
def f(df):
        return df
    
master.pipe(f)


Out[5]:
id name price
0 i100 ham 230
1 i200 egg 150
2 i300 bacon 170

In [6]:
def discount(df):
    """
    商品名が ham だった場合に割り引きします
    """

    df2 = df.copy()
    df2.ix[df2.name == 'ham', 'price'] = df2.price - 30

    return df2
    
def tax_in(df, col):
    """
    消費税を計算したカラムを追加します
    """

    df['tax_in'] = df[col] * 1.08

    return df

(
master.pipe(discount)
      .pipe(tax_in, col='price')
)


Out[6]:
id name price tax_in
0 i100 ham 200 216.0
1 i200 egg 150 162.0
2 i300 bacon 170 183.6