8.1.3 データの結合
append
、concat
およびmerge
メソッドを使用して、データベース表を表すoml.DataFrame
オブジェクトのデータを結合できます。
次の各トピックには、これらのメソッドの使用例があります。
一方のオブジェクトから別のオブジェクトへのデータの追加
append
メソッドを使用して、同じデータ型の2つのオブジェクトを結合します。
例8-4 2つの表からのデータの追加
この例では、最初にoml.Float
系列オブジェクトnum1
を別のoml.Float
系列オブジェクトnum2
に追加します。次に、oml.DataFrame
オブジェクトを、同じ列型を持つ別のoml.DataFrame
オブジェクトに追加します。
import oml
import pandas as pd
df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
"val" : ["a", "b", "c", "d", "e"],
"ch" : ["p", "q", "r", "a", "b"],
"num" : [4, 3, 6.7, 7.2, 5]})
oml_df = oml.push(df)
# Append an oml.Float series object to another.
num1 = oml_df['id']
num2 = oml_df['num']
num1.append(num2)
# Append an oml.DataFrame object to another.
x = oml_df[['id', 'val']] # 1st column oml.Float, 2nd column oml.String
y = oml_df[['num', 'ch']] # 1st column oml.Float, 2nd column oml.String
x.append(y)
この例のリスト
>>> import oml
>>> import pandas as pd
>>>
>>> df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
... "val" : ["a", "b", "c", "d", "e"],
... "ch" : ["p", "q", "r", "a", "b"],
... "num" : [4, 3, 6.7, 7.2, 5]})
>>> oml_df = oml.push(df)
>>>
>>> # Append an oml.Float series object to another.
... num1 = oml_df['id']
>>> num2 = oml_df['num']
>>> num1.append(num2)
[1, 2, 3, 4, 5, 4, 3, 6.7, 7.2, 5]
>>>
>>> # Explicitly convert oml.Integer to oml.Float
>>> oml.Float(num1).append(num2)
>>> # Append an oml.DataFrame object to another.
... x = oml_df[['id', 'val']] # 1st column oml.Float, 2nd column oml.String
>>> y = oml_df[['num', 'ch']] # 1st column oml.Float, 2nd column oml.String
>>> x.append(y)
id val
0 1.0 a
1 2.0 b
2 3.0 c
3 4.0 d
4 5.0 e
5 4.0 p
6 3.0 q
7 6.7 r
8 7.2 a
9 5.0 b
2つのオブジェクトの結合
concat
メソッドを使用して、一方のオブジェクトの列を別のオブジェクトのものと結合します。concat
メソッドのauto_name
引数は、名前の競合の自動解消を起動するかどうかを制御します。ディクショナリ・マッピング文字列をオブジェクトに渡すことで、カスタマイズした名前変更を実行することもできます。
concat
メソッドを使用して2つのオブジェクトを結合するには、両方のオブジェクトが、基礎となる同じデータベース表、ビューまたは問合せのデータを表す必要があります。
例8-5 列単位のデータの結合
この例では、最初に2つのoml.DataFrame
オブジェクトx
とy
を列単位で結合します。次に、オブジェクトy
をoml.Float
系列オブジェクトw
と連結します。
import oml
import pandas as pd
from collections import OrderedDict
df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
"val" : ["a", "b", "c", "d", "e"],
"ch" : ["p", "q", "r", "a", "b"],
"num" : [4, 3, 6.7, 7.2, 5]})
oml_df = oml.push(df)
# Create two oml.DataFrame objects and combine the objects column-wise.
x = oml_df[['id', 'val']]
y = oml_df[['num', 'ch']]
x.concat(y)
# Create an oml.Float object with the rounded exponential of two times
# the values in the num column of the oml_df object, then
# concatenate it with the oml.DataFrame object y using a new column name.
w = (oml_df['num']*2).exp().round(decimals=2)
y.concat({'round(exp(2*num))':w})
# Concatenate object x with multiple objects and turn on automatic
# name conflict resolution.
z = oml_df[:,'id']
x.concat([z, w, y], auto_name=True)
# Concatenate multiple oml data objects and perform customized renaming.
x.concat(OrderedDict([('ID',z), ('round(exp(2*num))',w), ('New_',y)]))
この例のリスト
>>> import oml
>>> import pandas as pd
>>> from collections import OrderedDict
>>>
>>> df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
... "val" : ["a", "b", "c", "d", "e"],
... "ch" : ["p", "q", "r", "a", "b"],
... "num" : [4, 3, 6.7, 7.2, 5]})
>>> oml_df = oml.push(df)
>>> # Create two oml.DataFrame objects and combine the objects column-wise.
... x = oml_df[['id', 'val']]
>>> y = oml_df[['num', 'ch']]
>>> x.concat(y)
id val num ch
0 1 a 4.0 p
1 2 b 3.0 q
2 3 c 6.7 r
3 4 d 7.2 a
4 5 e 5.0 b
>>>
>>> # Create an oml.Float object with the rounded exponential of two times
... # the values in the num column of the oml_df object, then
... # concatenate it with the oml.DataFrame object y using a new column name.
... w = (oml_df['num']*2).exp().round(decimals=2)
>>> y.concat({'round(exp(2*num))':w})
num ch round(exp(2*num))
0 4.0 p 2980.96
1 3.0 q 403.43
2 6.7 r 660003.22
3 7.2 a 1794074.77
4 5.0 b 22026.47
>>>
>>> # Concatenate object x with multiple objects and turn on automatic
... # name conflict resolution.
... z = oml_df[:,'id']
>>> x.concat([z, w, y], auto_name=True)
id val id3 num num5 ch
0 1 a 1 2980.96 4.0 p
1 2 b 2 403.43 3.0 q
2 3 c 3 660003.22 6.7 r
3 4 d 4 1794074.77 7.2 a
4 5 e 5 22026.47 5.0 b
>>>
>>> # Concatenate multiple oml data objects and perform customized renaming.
... x.concat(OrderedDict([('ID',z), ('round(exp(2*num))',w), ('New_',y)]))
id val ID round(exp(2*num)) New_num New_ch
0 1 a 1 2980.96 4.0 p
1 2 b 2 403.43 3.0 q
2 3 c 3 660003.22 6.7 r
3 4 d 4 1794074.77 7.2 a
4 5 e 5 22026.47 5.0 b
2つのオブジェクトのデータの結合
merge
メソッドを使用して、2つのオブジェクトのデータを結合します。
例8-6 2つの表のデータの結合
この例では、最初にoml.DataFrame
オブジェクトx
およびy
に対してクロス結合を実行して、oml.DataFrame
オブジェクトxy
を作成します。この例では、x
の最初の4行とoml.DataFrame
オブジェクトotherの左外部結合を共有列idに基づいて実行し、左側と右側の列名に接尾辞.l
と.r
をそれぞれ適用します。次に、左側のオブジェクトx
のid列および右側のオブジェクトy
のnum列に基づいて右外部結合を実行します。
import oml
import pandas as pd
df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
"val" : ["a", "b", "c", "d", "e"],
"ch" : ["p", "q", "r", "a", "b"],
"num" : [4, 3, 6.7, 7.2, 5]})
oml_df = oml.push(df)
x = oml_df[['id', 'val']]
y = oml_df[['num', 'ch']]
# Perform a cross join.
xy = x.merge(y)
xy
# Perform a left outer join.
x.head(4).merge(other=oml_df[['id', 'num']], on="id",
suffixes=['.l','.r'])
# Perform a right outer join.
x.merge(other=y, left_on="id", right_on="num", how="right")
この例のリスト
>>> import oml
>>> import pandas as pd
>>>
>>> df = pd.DataFrame({"id" : [1, 2, 3, 4, 5],
... "val" : ["a", "b", "c", "d", "e"],
... "ch" : ["p", "q", "r", "a", "b"],
... "num" : [4, 3, 6.7, 7.2, 5]})
>>> oml_df = oml.push(df)
>>>
>>> x = oml_df[['id', 'val']]
>>> y = oml_df[['num', 'ch']]
>>>
>>> # Perform a cross join.
... xy = x.merge(y)
>>> xy
id_l val_l num_r ch_r
0 1 a 4.0 p
1 1 a 3.0 q
2 1 a 6.7 r
3 1 a 7.2 a
4 1 a 5.0 b
5 2 b 4.0 p
6 2 b 3.0 q
7 2 b 6.7 r
8 2 b 7.2 a
9 2 b 5.0 b
10 3 c 4.0 p
11 3 c 3.0 q
12 3 c 6.7 r
13 3 c 7.2 a
14 3 c 5.0 b
15 4 d 4.0 p
16 4 d 3.0 q
17 4 d 6.7 r
18 4 d 7.2 a
19 4 d 5.0 b
20 5 e 4.0 p
21 5 e 3.0 q
22 5 e 6.7 r
23 5 e 7.2 a
24 5 e 5.0 b
>>>
>>> # Perform a left outer join.
... x.head(4).merge(other=oml_df[['id', 'num']], on="id",
... suffixes=['.l','.r'])
id val.l num.r
0 1 a 4.0
1 2 b 3.0
2 3 c 6.7
3 4 d 7.2
>>>
>>> # Perform a right outer join.
... x.merge(other=y, left_on="id", right_on="num", how="right")
id_l val_l num_r ch_r
0 3.0 c 3.0 q
1 4.0 d 4.0 p
2 5.0 e 5.0 b
3 NaN None 6.7 r
4 NaN None 7.2 a
親トピック: データの準備