インデックスで2つのデータフレームをマージする


161

こんにちは私は次のデータフレームを持っています:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

どのようにしてインデックスをマージして取得しますか?

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

merge()つまりdf1.merge(df2)、マッチングを行うために列を使用することは私の理解です。実際、これを行うと次のようになります。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

インデックスでマージするのは悪い習慣ですか?それは不可能ですか?もしそうなら、インデックスを「インデックス」と呼ばれる新しい列にシフトするにはどうすればよいですか?

ありがとう


3
これを試してください:df1.join(df2)
MaxU

1つのデータフレームのインデックスと2番目のデータフレームの列で結合する場合はどうでしょうか。(私の2番目のデータフレームには、最初のdfのインデックスと一致する列があります。)
mikey

回答:


322

mergeデフォルトで内部結合であるを使用します。

pd.merge(df1, df2, left_index=True, right_index=True)

またはjoin、デフォルトでは結合されたままです:

df1.join(df2)

またはconcat、デフォルトでは外部結合です。

pd.concat([df1, df2], axis=1)

サンプル

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
いいね。他の人がこれを読んでいて、うまくいかない場合.transpose()は、dfの1つを使用してインデックスを同期する必要があるかどうかを確認してください。これが私の問題でした
Jona

2
どうもありがとう。すばらしい答えです。しかし、なぜないconcatながら、括弧でDFを配置する必要がありますjoinし、mergeではないのですか?
Bowen Liu

@Bowenようなリストで可能な連結、複数のデータフレームのための私の意見で劉dfs = [df1, df2, df3,... dfn]当時とdf = pd. concat(dfs)
jezrael

@jezrael私の新しい質問をstackoverflow.com/questions/57133848/…
Msquare

29

インデックスで整列された2つ以上のDFを連結するには、concat([df1、df2、...]、axis = 1)を使用できます。

pd.concat([df1, df2, df3, ...], axis=1)

または、カスタムフィールド/インデックスで連結するためにマージします。

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

または、インデックスで結合するために結合します。

 df1.join(df2)

6

デフォルトで
joinは、列方向の左結合
pd.mergeは列方向の内部結合
pd.concatで、行方向の外部結合です。

pd.concat
Iterable引数を取ります。したがって、DataFrameを直接取得することはできません(を使用[df,df2]
。DataFrameの次元は軸に沿って一致する必要があります

Joinand pd.merge
DataFrame引数を取ることができます


5

馬鹿げたバグがありました:インデックスがdtypes異なるため、結合が失敗しました。両方のテーブルが同じ元のテーブルのピボットテーブルだったため、これは明白ではありませんでした。以降reset_index、Jupyterのインデックスは同じに見えました。Excelに保存するときにのみ明らかになりました...

で修正: df1[['key']] = df1[['key']].apply(pd.to_numeric)

うまくいけば、これは誰かを1時間節約します!


4

パンダで2つのデータフレームを結合したい場合は、mergeまたはのような使用可能な属性を使用できますconcatenate。たとえば、2つのデータフレームがdf1あり、df2次の方法でデータフレームに参加できるとします。

newdataframe=merge(df1,df2,left_index=True,right_index=True)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.