Coursera『Introduction to Data Science in Python – by University of Michigan』の学習メモ
Merging Dataframes
第3週目もpandasのDataFrameについて掘り下げる。ここらへんは前回の自己学習(復習)でも触れたものも多い。
使うデータは以下の通り。
import pandas as pd
df = pd.DataFrame([{'Name': 'Chris', 'Item Purchased': 'Sponge', 'Cost': 22.50},
{'Name': 'Kevyn', 'Item Purchased': 'Kitty Litter', 'Cost': 2.50},
{'Name': 'Filip', 'Item Purchased': 'Spoon', 'Cost': 5.00}],
index=['Store 1', 'Store 1', 'Store 2'])
df
データフレームへのカラムの追加
データフレームに値を入れる場合、行数とデータ数を一致させなくはならない。つまり、一部の行にデータが入っていない場合は、Noneを明示する必要がある。
df['Date'] = ['December 1', 'January 1', 'mid-May', ]
df['Delivered'] = True
df['Feedback'] = ['Positive', None, 'Negative']
シリーズをデータフレームに入れる
シリーズを使えば、指定した行だけに値を入れることができる。
adf = df.reset_index()
adf['Date'] = pd.Series({0: 'December 1', 2: 'mid-May'})
データベース用語の整理
Outer Join (Union)
Inner Join (Intersection)
staff_df = pd.DataFrame([{'Name': 'Kelly', 'Role': 'Director of HR'},
{'Name': 'Sally', 'Role': 'Course liasion'},
{'Name': 'James', 'Role': 'Grader'}])
staff_df = staff_df.set_index('Name')
student_df = pd.DataFrame([{'Name': 'James', 'School': 'Business'},
{'Name': 'Mike', 'School': 'Law'},
{'Name': 'Sally', 'School': 'Engineering'}])
student_df = student_df.set_index('Name')
print(staff_df.head())
print()
print(student_df.head())
# Role
# Name
# Kelly Director of HR
# Sally Course liasion
# James Grader
#
# School
# Name
# James Business
# Mike Law
# Sally Engineering
Outer Join
mergerの引数を how=’outer’ とする。
pd.merge(staff_df, student_df, how='outer', left_index=True, right_index=True)
Inner Join
mergerの引数を how=’inner’ とする。
pd.merge(staff_df, student_df, how='inner', left_index=True, right_index=True)
Set addition
merge(staff_df, student_df) として引数を how=’left’ とすれば左のテーブルを基準に、how=’right’ とすれば右のテーブルを基準にマージすることができる。
pd.merge(staff_df, student_df, how='left', left_index=True, right_index=True)
# Role School
# Name
# Kelly Director of HR NaN
# Sally Course liasion Engineering
# James Grader Business
pd.merge(staff_df, student_df, how='right', left_index=True, right_index=True)
# Role School
# Name
# James Grader Business
# Mike NaN Law
# Sally Course liasion Engineering
Index以外でのmerge
staff_df = staff_df.reset_index()
student_df = student_df.reset_index()
pd.merge(staff_df, student_df, how='left', left_on='Name', right_on='Name')
複数のカラムをキーにしたmerge
staff_df = pd.DataFrame([{'First Name': 'Kelly', 'Last Name': 'Desjardins', 'Role': 'Director of HR'},
{'First Name': 'Sally', 'Last Name': 'Brooks', 'Role': 'Course liasion'},
{'First Name': 'James', 'Last Name': 'Wilde', 'Role': 'Grader'}])
student_df = pd.DataFrame([{'First Name': 'James', 'Last Name': 'Hammond', 'School': 'Business'},
{'First Name': 'Mike', 'Last Name': 'Smith', 'School': 'Law'},
{'First Name': 'Sally', 'Last Name': 'Brooks', 'School': 'Engineering'}])
staff_df
student_df
pd.merge(staff_df, student_df, how='inner', left_on=['First Name','Last Name'], right_on=['First Name','Last Name'])