为什么Pandas内连接会产生ValueError:len(left_on)必须等于"right"索引中的级别数?

Ian*_*yce 52 python merge join inner-join pandas

我正在尝试将DataFrame A内部连接到DataFrame B并遇到错误.

这是我的连接声明:

merged = DataFrameA.join(DataFrameB, on=['Code','Date'])
Run Code Online (Sandbox Code Playgroud)

这是错误:

ValueError: len(left_on) must equal the number of levels in the index of "right"
Run Code Online (Sandbox Code Playgroud)

我不确定列顺序是否重要(它们不是真正"有序"的吗?),但为了以防万一,DataFrames组织如下:

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)
Run Code Online (Sandbox Code Playgroud)

我需要更正我的加入声明吗?或者是否有另一种更好的方法来获得这两个DataFrame的交集(或内连接)?

JAB*_*JAB 74

使用merge,如果你没有在指数加盟:

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

跟进以下问题:

这是一个可重复的例子:

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'])
Run Code Online (Sandbox Code Playgroud)

结果是:

    code    col1    date    col2
0   ABC     10      2014-06-01  10
1   EFG     100     2014-06-02  200
Run Code Online (Sandbox Code Playgroud)

运行此代码会发生什么?


Jer*_*uke 18

这是另一种表演方式join.与验证的答案不同,这是适用于所有其他类型的连接的更一般的答案.

内部联接

inner join也可以通过以下方式明确提及它来执行how:

pd.merge(df1, df2, on='filename', how='inner')
Run Code Online (Sandbox Code Playgroud)

相同的方法适用于其他类型的连接:

外连接

pd.merge(df1, df2, on='filename', how='outer')
Run Code Online (Sandbox Code Playgroud)

左加入

pd.merge(df1, df2, on='filename', how='left')
Run Code Online (Sandbox Code Playgroud)

正确加入

pd.merge(df1, df2, on='filename', how='right')
Run Code Online (Sandbox Code Playgroud)