1. ホーム
  2. パイソン

パンダのマージ、スプライス、コンバイン

2022-02-25 01:29:35
<パス

記事目次


異なる場所にあるデータソースを統一されたデータ構造に統合し、属性を追加し、サンプルを追加します。

マージ merge()

公式ドキュメントへのリンク
構文です。 pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True、 indicator=False、 validate=None)を実行。
パラメータです。

  • を左にします。 データフレーム
  • の右側です。 データフレーム
  • どのように 接続方法, 'left', 'right', 'outer', 'inner ', デフォルト 'inner'.
  • をオンにします。 ラベルまたはリスト。結合キーを指定し、複数のキーを指定することができます。 none または次の4つのパラメータを使用しない場合、両側の重複する列はすべてこのキーで結合されます。
  • left_on. ラベルまたはリスト、または配列のようなもの。左結合のキーを指定します、複数のキーを指定することができます。
  • right_on. ラベルまたはリスト、または配列のようなものです。右側の結合キーを指定します。複数のキーを指定できます。
  • left_indexを指定します。 ブール値、デフォルトは False。Trueは、左側のデータボックスが結合キーとしてインデックスを持ち、それがマルチレベルインデックスである場合、右側も同じレベルである必要があることを意味します。
  • right_index. ブール値、デフォルトは False。Trueは、右側のデータボックスがインデックスを結合キーとして持つことを意味する
  • をソートします。 ブール値、デフォルトは False。Trueは連結されたキーでソートすることを意味する
  • サフィックスを使用します。 タプル(str, str)、デフォルト('_x', '_y')。マージされたものに重複するカラムがある場合、それらを別々にサフィックスする。suffixes=(False, False)の場合、カラムが重複している場合は例外を発生させる。
  • をコピーしてください。 ブール値、デフォルトはFalseです。
  • インジケータを使用します。 boolまたはstr、デフォルトFalse。行がレコードの左側からか右側からかを示す新しい列 "_merge"(デフォルト、指定可能)を追加する、orboth。
  • を検証します。 str, オプション。キーが重複しているかどうかを検出します。
    • 1:1」は、両方の結合キーが重複した値を持つことができないことを意味し、それ以外の場合はエラーが報告される
    • 1:m」は、左側の結合キーが重複した値を持つことができないことを意味し、そうでない場合はエラーが報告されます。
    • 'm:1' は右側の連結キーが重複してはいけないことを意味し、そうでない場合はエラーが報告される
    • m:m' は、連結キーの両方が重複した値を持つ可能性があることを意味します。

注意事項 left_on, right_on と left_index, right_index は混在可能です。

df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'], 'value': [1, 2, 3, 5]})
df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'], 'value': [5, 6, 7, 8]})
df1
    lkey value
0 foo 1
1 bar 2
2 baz 3
3 foo 5
df2
    rkey value
0 foo 5
1 bar 6
2 baz 7
3 foo 8

pd.merge(df1, df2, left_on='lkey', right_on='rkey', suffixes=('_left', '_right'))
  lkey value_left rkey value_right
0 foo 1 foo 5
1 foo 1 foo 8
2 foo 5 foo 5
3 foo 5 foo 8
4 bar 2 bar 6
5 baz 3 baz 7

>>> df1.merge(df2, left_on='lkey', right_on='rkey', suffixes=(False, False))
Traceback (most recent call last):
...
ValueError: columns overlap but no suffix specified:
    Index(['value'], dtype='object')


スプライス concat()

シンタックス pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
使用する。 使用するには、DataFrameまたはSeriesが同じインデックス構造(レベル数)を持つ必要があります。軸を使用して、縦方向(サンプルを追加する)または横方向(行インデックスを使用して結合)のどちらで縫合するかを指定します。結合を使用して、外部または内部で結合するかを指定します。キーを使用して新しい階層的インデックスを追加し、objsのオブジェクトごとに1つ生成します。
パラメータです。
objs. 接続するDataFrameとSeriesのオブジェクトをリストまたは辞書として渡します。辞書として渡された場合、パラメータのキーの使い方が関係してきますので、以下を参照してください。
の軸になります。 {0/'index', 1/'columns'}, デフォルトは0です。垂直方向に連結、または水平方向に連結
を結合します。 {'inner', 'outer'}, デフォルトは 'outer' です。内側または外側join
ignore_index. ブール値、デフォルトは False。既存のインデックスを無視し、インデックス0、1、2......に対して新しいシングルレベルインデックスを生成するかどうか。
キーになります。 新しいインデックスを生成します。
の名前になります。 リスト、デフォルトは None。新しく生成されたマルチレベル・インデックスに名前を付けるには、次の例を追加します。
verify_integrity です。 新しい連結軸に重複が含まれているかどうかをチェックします。これは、実際のデータ連結に対して非常に高価になる場合があります。

fra1 = pd.DataFrame(np.array([[25, 70], [40, 80], [15, 40], [20, 65]]), index=['a', 'b', 'c', 'd'], columns=['age', 'weight'])
fra2 = pd.DataFrame(np.array([[20, 60], [15, 80], [40, 100], [60, 50]]), index=['c', 'd', 'e', 'f'], columns=['age', 'height'])
ser = pd.Series([165, 170, 180, 158], index=['c', 'd', 'e', 'f'])
ser.name = 'size'

fra1
Out[74]: 
   age weight
a 25 70
b 40 80
c 15 40
d 20 65

fra2
Out[75]: 
   age height
c 20 60
d 15 80
e 40 100
f 60 50

ser
Out [76]: 
c 165
d 170
e 180
f 158
Name: size, dtype: int64

# horizontal splice, outer join, set new level index
pd.concat([fra1, fra2, ser], axis=1, join='outer', keys=['fra1', 'fra2', 'ser'], names=['level0', 'level1'])
Out[77]: 
level0 fra1 fra2 ser
level1 age weight age height size
a 25.0 70.0 NaN NaN NaN
b 40.0 80.0 NaN NaN NaN
c 15.0 40.0 20.0 60.0 165.0
d 20.0 65.0 15.0 80.0 170.0
e NaN NaN 40.0 100.0 180.0
f NaN NaN 60.0 50.0 158.0

#internal connection
pd.concat([fra1, fra2, ser], axis=1, join='inner', keys=['fra1', 'fra2', 'ser'], names=['level0', 'level1'])
Out[78]: 
level0 fra1 fra2 ser
level1 age weight age height size
c 15 40 20 60 165
d 20 65 15 80 170
#One way to write it is to omit the keys parameter
pd.concat({'fra1':fra1, 'fra2':fra2, 'ser':ser}, axis=1, join='inner', names=['level0', 'level1'])
Out[83]: 
level0 fra1 fra2 ser
level1 age weight age height size
c 15 40 20 60 165
d 20 65 15 8

<イグ

combocombine_first()

シンタックス fra1.combine_first(fra2)
使用する。 fra1のNaN要素をfra2の同じ位置(インデックス位置を意味する)の非NaN要素で埋めます。両者のインデックスを全て含み、NaNを用いて欠損要素(片方にしか存在しない場合、一部の行インデックスが欠損)を埋めた新しいDataFrameオブジェクトを取得します。 fraはSeriesも可能です。

fra1 = pd.DataFrame(np.array([[25, 70], [40, 80], [15, np.NaN], [np.NaN, 65]]), index=['a', 'b', 'c', 'd'], columns=['age', 'weight'])
fra2 = pd.DataFrame(np.array([[20, 60], [15, 80], [np.NaN, 100], [60, 50]]), index=['c', 'd', 'e', 'f'], columns=['age', 'height'])

fra1
Out[24]: 
    age weight
a 25.0 70.0
b 40.0 80.0
c 15.0 NaN
d NaN 65.0

fra2
Out [25]: 
    age height
c 20.0 60.0
d 15.0 80.0
e NaN 100.0
f 60.0 50.0

fra1.combine_first(fra2)
Out[26]: 
    age height weight
a 25.0 NaN 70.0
b 40.0 NaN 80.0
c 15.0 60.0 NaN
d 15.0 80.0 65.0
e NaN 100.0 NaN
f 60.0 50.0 NaN