{
"cells": [
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from pandas import DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" X | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" Z | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" Y | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" Z | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" X | \n",
"
\n",
" \n",
" 5 | \n",
" 5 | \n",
" X | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key\n",
"0 0 X\n",
"1 1 Z\n",
"2 2 Y\n",
"3 3 Z\n",
"4 4 X\n",
"5 5 X"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# サンプルになるDataFrameを作ります。\n",
"dframe1 = DataFrame({'key':['X','Z','Y','Z','X','X'],'data_set_1': np.arange(6)})\n",
"dframe1"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_2 | \n",
" key | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Q | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" Y | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" Z | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_2 key\n",
"0 1 Q\n",
"1 2 Y\n",
"2 3 Z"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# もう一つ別のDataFrameを作ります。\n",
"dframe2 = DataFrame({'key':['Q','Y','Z'],'data_set_2':[1,2,3]})\n",
"dframe2"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
" data_set_2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" Y | \n",
" 2 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key data_set_2\n",
"0 1 Z 3\n",
"1 3 Z 3\n",
"2 2 Y 2"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#mergeメソッドを使います。これは、多対一\n",
"pd.merge(dframe1,dframe2)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
" data_set_2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" Y | \n",
" 2 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key data_set_2\n",
"0 1 Z 3\n",
"1 3 Z 3\n",
"2 2 Y 2"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 列名を指定できます。\n",
"pd.merge(dframe1,dframe2,on='key')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
" data_set_2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" Y | \n",
" 2 | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
" 5 | \n",
" 5 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key data_set_2\n",
"0 0 X NaN\n",
"1 1 Z 3\n",
"2 2 Y 2\n",
"3 3 Z 3\n",
"4 4 X NaN\n",
"5 5 X NaN"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 列名を指定して、どのようにマージするかも選べます。\n",
"pd.merge(dframe1,dframe2,on='key',how='left')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
" data_set_2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 1 | \n",
" 3 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" Y | \n",
" 2 | \n",
"
\n",
" \n",
" 3 | \n",
" NaN | \n",
" Q | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key data_set_2\n",
"0 1 Z 3\n",
"1 3 Z 3\n",
"2 2 Y 2\n",
"3 NaN Q 1"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# howの引数を変えてみましょう。\n",
"pd.merge(dframe1,dframe2,on='key',how='right')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_1 | \n",
" key | \n",
" data_set_2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 4 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
" 2 | \n",
" 5 | \n",
" X | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" 3 | \n",
" Z | \n",
" 3 | \n",
"
\n",
" \n",
" 5 | \n",
" 2 | \n",
" Y | \n",
" 2 | \n",
"
\n",
" \n",
" 6 | \n",
" NaN | \n",
" Q | \n",
" 1 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_1 key data_set_2\n",
"0 0 X NaN\n",
"1 4 X NaN\n",
"2 5 X NaN\n",
"3 1 Z 3\n",
"4 3 Z 3\n",
"5 2 Y 2\n",
"6 NaN Q 1"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# keyに関して両方のDataFrameのデータを使いたい場合\n",
"pd.merge(dframe1,dframe2,on='key',how='outer')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" data_set_3 | \n",
" key | \n",
" data_set_4 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" X | \n",
" 2 | \n",
"
\n",
" \n",
" 1 | \n",
" 0 | \n",
" X | \n",
" 3 | \n",
"
\n",
" \n",
" 2 | \n",
" 1 | \n",
" X | \n",
" 2 | \n",
"
\n",
" \n",
" 3 | \n",
" 1 | \n",
" X | \n",
" 3 | \n",
"
\n",
" \n",
" 4 | \n",
" 2 | \n",
" X | \n",
" 2 | \n",
"
\n",
" \n",
" 5 | \n",
" 2 | \n",
" X | \n",
" 3 | \n",
"
\n",
" \n",
" 6 | \n",
" 3 | \n",
" Y | \n",
" 0 | \n",
"
\n",
" \n",
" 7 | \n",
" 3 | \n",
" Y | \n",
" 1 | \n",
"
\n",
" \n",
" 8 | \n",
" 4 | \n",
" Z | \n",
" 4 | \n",
"
\n",
" \n",
" 9 | \n",
" 5 | \n",
" Z | \n",
" 4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" data_set_3 key data_set_4\n",
"0 0 X 2\n",
"1 0 X 3\n",
"2 1 X 2\n",
"3 1 X 3\n",
"4 2 X 2\n",
"5 2 X 3\n",
"6 3 Y 0\n",
"7 3 Y 1\n",
"8 4 Z 4\n",
"9 5 Z 4"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 今度は多対多\n",
"# 両方のDataFrameで、keyに関して複数の行がある。\n",
"dframe3 = DataFrame({'key': ['X', 'X', 'X', 'Y', 'Z', 'Z'],\n",
" 'data_set_3': range(6)})\n",
"dframe4 = DataFrame({'key': ['Y', 'Y', 'X', 'X', 'Z'],\n",
" 'data_set_4': range(5)})\n",
"#Show the merge\n",
"pd.merge(dframe3, dframe4)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" key1 | \n",
" key2 | \n",
" left_data | \n",
" right_data | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" 40 | \n",
"
\n",
" \n",
" 1 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" 50 | \n",
"
\n",
" \n",
" 2 | \n",
" SF | \n",
" two | \n",
" 20 | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" LA | \n",
" one | \n",
" 30 | \n",
" 60 | \n",
"
\n",
" \n",
" 4 | \n",
" LA | \n",
" two | \n",
" NaN | \n",
" 70 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" key1 key2 left_data right_data\n",
"0 SF one 10 40\n",
"1 SF one 10 50\n",
"2 SF two 20 NaN\n",
"3 LA one 30 60\n",
"4 LA two NaN 70"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 複数の列名に関して、mergeを使うこともできます。\n",
"df_left = DataFrame({'key1': ['SF', 'SF', 'LA'],\n",
" 'key2': ['one', 'two', 'one'],\n",
" 'left_data': [10,20,30]})\n",
"df_right = DataFrame({'key1': ['SF', 'SF', 'LA', 'LA'],\n",
" 'key2': ['one', 'one', 'one', 'two'],\n",
" 'right_data': [40,50,60,70]})\n",
"pd.merge(df_left, df_right, on=['key1', 'key2'], how='outer')"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" key1 | \n",
" key2_x | \n",
" left_data | \n",
" key2_y | \n",
" right_data | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" one | \n",
" 40 | \n",
"
\n",
" \n",
" 1 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" one | \n",
" 50 | \n",
"
\n",
" \n",
" 2 | \n",
" SF | \n",
" two | \n",
" 20 | \n",
" one | \n",
" 40 | \n",
"
\n",
" \n",
" 3 | \n",
" SF | \n",
" two | \n",
" 20 | \n",
" one | \n",
" 50 | \n",
"
\n",
" \n",
" 4 | \n",
" LA | \n",
" one | \n",
" 30 | \n",
" one | \n",
" 60 | \n",
"
\n",
" \n",
" 5 | \n",
" LA | \n",
" one | \n",
" 30 | \n",
" two | \n",
" 70 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" key1 key2_x left_data key2_y right_data\n",
"0 SF one 10 one 40\n",
"1 SF one 10 one 50\n",
"2 SF two 20 one 40\n",
"3 SF two 20 one 50\n",
"4 LA one 30 one 60\n",
"5 LA one 30 two 70"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 列名が重複している場合は、自動的にsuffix(接尾辞)を付けてくる\n",
"pd.merge(df_left,df_right,on='key1')"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" key1 | \n",
" key2_lefty | \n",
" left_data | \n",
" key2_righty | \n",
" right_data | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" one | \n",
" 40 | \n",
"
\n",
" \n",
" 1 | \n",
" SF | \n",
" one | \n",
" 10 | \n",
" one | \n",
" 50 | \n",
"
\n",
" \n",
" 2 | \n",
" SF | \n",
" two | \n",
" 20 | \n",
" one | \n",
" 40 | \n",
"
\n",
" \n",
" 3 | \n",
" SF | \n",
" two | \n",
" 20 | \n",
" one | \n",
" 50 | \n",
"
\n",
" \n",
" 4 | \n",
" LA | \n",
" one | \n",
" 30 | \n",
" one | \n",
" 60 | \n",
"
\n",
" \n",
" 5 | \n",
" LA | \n",
" one | \n",
" 30 | \n",
" two | \n",
" 70 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" key1 key2_lefty left_data key2_righty right_data\n",
"0 SF one 10 one 40\n",
"1 SF one 10 one 50\n",
"2 SF two 20 one 40\n",
"3 SF two 20 one 50\n",
"4 LA one 30 one 60\n",
"5 LA one 30 two 70"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 追加する文字列を指定することも可能です。\n",
"pd.merge(df_left,df_right, on='key1',suffixes=('_lefty','_righty'))"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# 公式ドキュメントはこちら\n",
"url = 'http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.merge.html'"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}