PandsはDataframeの合併を実現します。
概要
PandsはSeriesとDataframeを結合する多くの強力な機能を提供しており、これらの機能によってデータ解析が容易に行えます。本論文ではPandsを使ってSeriesとDataframeを統合する方法を詳しく説明します。
concatを使う
concatは最もよく使われる統合DFの方法です。まずconcatの定義を見てください。
objsはSeriesまたはSeriesのシーケンスまたはマッピングです。
axisは接続する軸を指定します。
イグノア.index:元のindex値を無視して、0,1,...n-1を使って代替します。
コピーするかどうか。
keys:最外層の多階層構造のindexを指定します。
まずいくつかのDFを定義してから、どのようにconcatを使ってこれらのDFを接続するかを見ます。
複数の階層の例を挙げます。
キーを使用して、frameの異なるframeのkeyを指定できます。
使う時、外部のキーを選択して特定のframeに戻ります。
デフォルトの
以下はジョイン=innerの状況を見ます。
ジョン='inner'はindexと同じものだけを選んで展示します。
もし合併後、元のフレームのindexに関するデータだけを保存したいなら、reindexを使用できます。
DFとSeriesをマージできます。
複数のSeriesであれば、concatを使って列名を指定できます。
appedはconcatの簡略化されたバージョンと見なされ、
appedの二つのDFの列が異なると自動的にNaNを補完します。
ギノレをセットすればindex=Trueは、元のindexを無視して、割り当てindexを書き換えることができます。
DFアプリにSeriesを一つ:
mergeを使う
DFと一番似ているのはデータベースの表です。
まずmergeの定義を見てください。
onはジョインの列またはindex名を表しています。
lefton:左接続
how:接続の方式は、
まず簡単なmergeの例を見ます。
上の二つのDFはkeyによって接続されている。
複数のkey接続の例を見てください。
Howはmerge方式を指定できます。データベースと同じように、内部接続、外部接続などを指定できます。
統合の方法
SQLメソッド
left
LEFT OUTER JOIN
ライト
RIGHT OUTER JIN
outer
FULL OUTER JOIN
inner
INNER JOIN
indicator=Trueを指定して、具体的な行の接続方法を表すことができます。
複数の列のマージをサポートします。
ジョインを使う
ジョンは2つの異なるindexのDFを一つに統合する。mergeの略字と見られます。
howを指定して接続先を指定できます。
デフォルトのジョンはindexで接続されています。
列に沿って接続することもできます。
個々のindexと複数のindexはjoinを行う:
列名が重複している場合:
列名を繰り返す名前のルールをカスタマイズできます。
データを上書き
DF 2のデータを使ってDF 1のデータを充填する必要がある場合があります。この場合はcompbine_を使用してもいいです。first:
ここで、PandsがDataframeの合併を実現することについての記事を紹介します。Pands Dataframeの合併内容については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
PandsはSeriesとDataframeを結合する多くの強力な機能を提供しており、これらの機能によってデータ解析が容易に行えます。本論文ではPandsを使ってSeriesとDataframeを統合する方法を詳しく説明します。
concatを使う
concatは最もよく使われる統合DFの方法です。まずconcatの定義を見てください。
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,
levels=None, names=None, verify_integrity=False, copy=True)
私たちがよく使うパラメータを見てください。objsはSeriesまたはSeriesのシーケンスまたはマッピングです。
axisは接続する軸を指定します。
join
:{'inner'、'outer'}接続方式は、他の軸のindexをどのように処理し、outerは合併を表し、innerは交差を表します。イグノア.index:元のindex値を無視して、0,1,...n-1を使って代替します。
コピーするかどうか。
keys:最外層の多階層構造のindexを指定します。
まずいくつかのDFを定義してから、どのようにconcatを使ってこれらのDFを接続するかを見ます。
In [1]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
...: 'B': ['B0', 'B1', 'B2', 'B3'],
...: 'C': ['C0', 'C1', 'C2', 'C3'],
...: 'D': ['D0', 'D1', 'D2', 'D3']},
...: index=[0, 1, 2, 3])
...:
In [2]: df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
...: 'B': ['B4', 'B5', 'B6', 'B7'],
...: 'C': ['C4', 'C5', 'C6', 'C7'],
...: 'D': ['D4', 'D5', 'D6', 'D7']},
...: index=[4, 5, 6, 7])
...:
In [3]: df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
...: 'B': ['B8', 'B9', 'B10', 'B11'],
...: 'C': ['C8', 'C9', 'C10', 'C11'],
...: 'D': ['D8', 'D9', 'D10', 'D11']},
...: index=[8, 9, 10, 11])
...:
In [4]: frames = [df1, df2, df3]
In [5]: result = pd.concat(frames)
df 1,df 2,df 3は、同じ列名と異なるindexを定義し、framesに入れてDFを構成するlistを定義し、これをパラメータとしてconcatに入れてDFを統合することができる。複数の階層の例を挙げます。
In [6]: result = pd.concat(frames, keys=['x', 'y', 'z'])
キーを使用して、frameの異なるframeのkeyを指定できます。
使う時、外部のキーを選択して特定のframeに戻ります。
In [7]: result.loc['y']
Out[7]:
A B C D
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7
上記の例で接続されている軸はデフォルトでは0です。つまり行で接続します。例を見てみます。列で接続するなら、axis=1を指定できます。
In [8]: df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
...: 'D': ['D2', 'D3', 'D6', 'D7'],
...: 'F': ['F2', 'F3', 'F6', 'F7']},
...: index=[2, 3, 6, 7])
...:
In [9]: result = pd.concat([df1, df4], axis=1, sort=False)
デフォルトの
join='outer'
は、合併後indexが存在しないところはNaNに補完されます。以下はジョイン=innerの状況を見ます。
In [10]: result = pd.concat([df1, df4], axis=1, join='inner')
ジョン='inner'はindexと同じものだけを選んで展示します。
もし合併後、元のフレームのindexに関するデータだけを保存したいなら、reindexを使用できます。
In [11]: result = pd.concat([df1, df4], axis=1).reindex(df1.index)
またはこのようにします
In [12]: pd.concat([df1, df4.reindex(df1.index)], axis=1)
Out[12]:
A B C D B D F
0 A0 B0 C0 D0 NaN NaN NaN
1 A1 B1 C1 D1 NaN NaN NaN
2 A2 B2 C2 D2 B2 D2 F2
3 A3 B3 C3 D3 B3 D3 F3
結果を見ますDFとSeriesをマージできます。
In [18]: s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X')
In [19]: result = pd.concat([df1, s1], axis=1)
複数のSeriesであれば、concatを使って列名を指定できます。
In [23]: s3 = pd.Series([0, 1, 2, 3], name='foo')
In [24]: s4 = pd.Series([0, 1, 2, 3])
In [25]: s5 = pd.Series([0, 1, 4, 5])
In [27]: pd.concat([s3, s4, s5], axis=1, keys=['red', 'blue', 'yellow'])
Out[27]:
red blue yellow
0 0 0 0
1 1 1 1
2 2 2 4
3 3 3 5
アプリを使うappedはconcatの簡略化されたバージョンと見なされ、
axis=0
に沿ってconcatが行われる。
In [13]: result = df1.append(df2)
appedの二つのDFの列が異なると自動的にNaNを補完します。
In [14]: result = df1.append(df4, sort=False)
ギノレをセットすればindex=Trueは、元のindexを無視して、割り当てindexを書き換えることができます。
In [17]: result = df1.append(df4, ignore_index=True, sort=False)
DFアプリにSeriesを一つ:
In [35]: s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
In [36]: result = df1.append(s2, ignore_index=True)
mergeを使う
DFと一番似ているのはデータベースの表です。
まずmergeの定義を見てください。
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None)
Left、rightは合併する二つのDFまたはSeriesです。onはジョインの列またはindex名を表しています。
lefton:左接続
right_on
:右接続left_index
:接続後、左のindexまたはcolumnを使用することを選択する。right_index
:接続後、右側のindexまたはcolumnを使用することを選択する。how:接続の方式は、
'left'
、'right'
、'outer'
、'inner'
、inner
。sort
:並べ替えかどうか。suffixes
:重複した列を処理する。copy
:データをコピーするかどうかまず簡単なmergeの例を見ます。
In [39]: left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
....: 'A': ['A0', 'A1', 'A2', 'A3'],
....: 'B': ['B0', 'B1', 'B2', 'B3']})
....:
In [40]: right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
....: 'C': ['C0', 'C1', 'C2', 'C3'],
....: 'D': ['D0', 'D1', 'D2', 'D3']})
....:
In [41]: result = pd.merge(left, right, on='key')
上の二つのDFはkeyによって接続されている。
複数のkey接続の例を見てください。
In [42]: left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
....: 'key2': ['K0', 'K1', 'K0', 'K1'],
....: 'A': ['A0', 'A1', 'A2', 'A3'],
....: 'B': ['B0', 'B1', 'B2', 'B3']})
....:
In [43]: right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
....: 'key2': ['K0', 'K0', 'K0', 'K0'],
....: 'C': ['C0', 'C1', 'C2', 'C3'],
....: 'D': ['D0', 'D1', 'D2', 'D3']})
....:
In [44]: result = pd.merge(left, right, on=['key1', 'key2'])
Howはmerge方式を指定できます。データベースと同じように、内部接続、外部接続などを指定できます。
統合の方法
SQLメソッド
left
LEFT OUTER JOIN
ライト
RIGHT OUTER JIN
outer
FULL OUTER JOIN
inner
INNER JOIN
In [45]: result = pd.merge(left, right, how='left', on=['key1', 'key2'])
indicator=Trueを指定して、具体的な行の接続方法を表すことができます。
In [60]: df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']})
In [61]: df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]})
In [62]: pd.merge(df1, df2, on='col1', how='outer', indicator=True)
Out[62]:
col1 col_left col_right _merge
0 0 a NaN left_only
1 1 b 2.0 both
2 2 NaN 2.0 right_only
3 2 NaN 2.0 right_only
indicatorに文字列が入ったら、indicatorという列の名前を変更します。
In [63]: pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
Out[63]:
col1 col_left col_right indicator_column
0 0 a NaN left_only
1 1 b 2.0 both
2 2 NaN 2.0 right_only
3 2 NaN 2.0 right_only
複数のindexを統合:
In [112]: leftindex = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'),
.....: ('K1', 'X2')],
.....: names=['key', 'X'])
.....:
In [113]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
.....: 'B': ['B0', 'B1', 'B2']},
.....: index=leftindex)
.....:
In [114]: rightindex = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
.....: ('K2', 'Y2'), ('K2', 'Y3')],
.....: names=['key', 'Y'])
.....:
In [115]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
.....: 'D': ['D0', 'D1', 'D2', 'D3']},
.....: index=rightindex)
.....:
In [116]: result = pd.merge(left.reset_index(), right.reset_index(),
.....: on=['key'], how='inner').set_index(['key', 'X', 'Y'])
複数の列のマージをサポートします。
In [117]: left_index = pd.Index(['K0', 'K0', 'K1', 'K2'], name='key1')
In [118]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
.....: 'B': ['B0', 'B1', 'B2', 'B3'],
.....: 'key2': ['K0', 'K1', 'K0', 'K1']},
.....: index=left_index)
.....:
In [119]: right_index = pd.Index(['K0', 'K1', 'K2', 'K2'], name='key1')
In [120]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
.....: 'D': ['D0', 'D1', 'D2', 'D3'],
.....: 'key2': ['K0', 'K0', 'K0', 'K1']},
.....: index=right_index)
.....:
In [121]: result = left.merge(right, on=['key1', 'key2'])
ジョインを使う
ジョンは2つの異なるindexのDFを一つに統合する。mergeの略字と見られます。
In [84]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
....: 'B': ['B0', 'B1', 'B2']},
....: index=['K0', 'K1', 'K2'])
....:
In [85]: right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
....: 'D': ['D0', 'D2', 'D3']},
....: index=['K0', 'K2', 'K3'])
....:
In [86]: result = left.join(right)
howを指定して接続先を指定できます。
In [87]: result = left.join(right, how='outer')
デフォルトのジョンはindexで接続されています。
列に沿って接続することもできます。
In [91]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
....: 'B': ['B0', 'B1', 'B2', 'B3'],
....: 'key': ['K0', 'K1', 'K0', 'K1']})
....:
In [92]: right = pd.DataFrame({'C': ['C0', 'C1'],
....: 'D': ['D0', 'D1']},
....: index=['K0', 'K1'])
....:
In [93]: result = left.join(right, on='key')
個々のindexと複数のindexはjoinを行う:
In [100]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
.....: 'B': ['B0', 'B1', 'B2']},
.....: index=pd.Index(['K0', 'K1', 'K2'], name='key'))
.....:
In [101]: index = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
.....: ('K2', 'Y2'), ('K2', 'Y3')],
.....: names=['key', 'Y'])
.....:
In [102]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
.....: 'D': ['D0', 'D1', 'D2', 'D3']},
.....: index=index)
.....:
In [103]: result = left.join(right, how='inner')
列名が重複している場合:
In [122]: left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]})
In [123]: right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})
In [124]: result = pd.merge(left, right, on='k')
列名を繰り返す名前のルールをカスタマイズできます。
In [125]: result = pd.merge(left, right, on='k', suffixes=('_l', '_r'))
データを上書き
DF 2のデータを使ってDF 1のデータを充填する必要がある場合があります。この場合はcompbine_を使用してもいいです。first:
In [131]: df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan],
.....: [np.nan, 7., np.nan]])
.....:
In [132]: df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]],
.....: index=[1, 2])
.....:
In [133]: result = df1.combine_first(df2)
ここで、PandsがDataframeの合併を実現することについての記事を紹介します。Pands Dataframeの合併内容については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。