web-dev-qa-db-ja.com

なぜPandas内部結合はValueErrorを与える:len(left_on)は "right"のインデックスのレベル数に等しくなければならないのか?

DataFrame AをDataFrame Bに内部結合しようとしていますが、エラーが発生しています。

私の参加ステートメントは次のとおりです。

merged = DataFrameA.join(DataFrameB, on=['Code','Date'])

そして、ここにエラーがあります:

ValueError: len(left_on) must equal the number of levels in the index of "right"

列の順序が重要かどうかはわかりませんが(列は実際に「順序付けられた」ものではありませんか?)、念のために、DataFrameは次のように構成されています。

DataFrameA:  Code, Date, ColA, ColB, ColC, ..., ColG, ColH (shape: 80514, 8 - no index)
DataFrameB:  Date, Code, Col1, Col2, Col3, ..., Col15, Col16 (shape: 859, 16 - no index)

結合ステートメントを修正する必要がありますか?または、これらの2つのDataFrameの交差(または内部結合)を取得する別のより良い方法はありますか?

48
Ian Joyce

インデックスに参加していない場合は、mergeを使用します。

merged = pd.merge(DataFrameA,DataFrameB, on=['Code','Date'])

以下の質問までフォローしてください

再現可能な例を次に示します。

import pandas as pd
# create some timestamps for date column
i = pd.to_datetime(pd.date_range('20140601',periods=2))

#create two dataframes to merge
df = pd.DataFrame({'code': ['ABC','EFG'], 'date':i,'col1': [10,100]})
df2 = pd.DataFrame({'code': ['ABC','EFG'], 'date':i,'col2': [10,200]})

#merge on columns (default join is inner)
pd.merge(df, df2, on =['code','date'])

この結果は次のとおりです。

    code    col1    date    col2
0   ABC     10      2014-06-01  10
1   EFG     100     2014-06-02  200

このコードを実行するとどうなりますか?

70
JAB

joinを実行する別の方法を次に示します。検証済みの回答とは異なり、これは他のすべての種類の結合に適用されるより一般的な回答です。

内部結合

inner joinは、howで次のように明示的に言及することでも実行できます。

pd.merge(df1, df2, on='filename', how='inner')

同じ方法論は、他のタイプの結合にも適用されます。

OuterJoin

pd.merge(df1, df2, on='filename', how='outer')

左結合

pd.merge(df1, df2, on='filename', how='left')

右結合

pd.merge(df1, df2, on='filename', how='right')
16
Jeru Luke