Python 为什么使用合并操作生成的数据帧不是3x3维而不是3x5维?

Python 为什么使用合并操作生成的数据帧不是3x3维而不是3x5维?,python,pandas,Python,Pandas,我按照说明进行操作,但是当合并列不具有相同的索引时,我会感到困惑。例如,d3中的列1对应于d4中的列1 In [92]: d4 Out[92]: 0 1 0 9 1 1 11 3 2 1 2 In [93]: d3 Out[93]: 0 1 0 2 3 1 1 9 2 3 9 In [94]: d3.merge(d4, how='left', left_on=0, right_on=1) Out[94]: 0 0_x 1_x 0_y

我按照说明进行操作,但是当合并列不具有相同的索引时,我会感到困惑。例如,d3中的列1对应于d4中的列1

In [92]: d4
Out[92]:
    0  1
0   9  1
1  11  3
2   1  2

In [93]: d3
Out[93]:
   0  1
0  2  3
1  1  9
2  3  9

In [94]: d3.merge(d4, how='left', left_on=0, right_on=1)
Out[94]:
   0  0_x  1_x  0_y  1_y
0  2    2    3    1    2
1  1    1    9    9    1
2  3    3    9   11    3
我认为结果应该是

   0  1 2
0  2  3 1
1  1  9 9
2  3  9 11
编辑1: 为什么下面的合并可以创建一个精确的3x3数据帧,而Former可以创建一个3x5数据帧

In [164]: d1
Out[164]:
   0   1
0  1  10
1  2   5
2  3   7

In [165]: d2
Out[165]:
   0  1
0  1  5
1  2  6
2  3  8

In [162]: d1.merge(d2, on=[0])
Out[162]:
   0  1_x  1_y
0  1   10    5
1  2    5    6
2  3    7    8

在第一次合并中,您正在合并列“0”上的lhs和列“1”上的rhs,但没有相同的值,因此必须创建两个带后缀的列。其余的列也没有匹配项,因此可以创建其他列

在第二个示例中,您在列“0”上进行了合并,因此您有相同的值,因此它不需要创建其他列,但是“1”的列名与值仍然存在冲突,因此它必须创建带有后缀的其他列

我认为您的困惑源于这样一种期望:因为您指定了要合并的列,所以它将使用这些列作为索引,并将其他列与这些行相匹配,而不会。只有将以下列设置为索引时,才会执行此操作:

In [23]:

merged = df1.set_index(keys=[1]).merge(df2.set_index(keys=[0]), left_index=True, right_index=True,how='left')
merged.index.names=['2']
merged.reset_index()
Out[23]:
   2   0  1
0  1   9  9
1  3  11  9
2  2   1  3

[3 rows x 3 columns]
因此,我在这些列上设置索引,并将
left_index
right_index
参数设置为
True

但是,我们必须将索引恢复为列,第一个问题是索引名与现有列名冲突,因此我们将其重命名


然后我们可以调用
reset\u index
来恢复这些值。

我看不出您的问题:您的预期结果只是panda的
merge
提供的列的子集。合并语法是
x.Merge(y)
0
是联接列,与您预期的相同。您的
1
列是
d3(=x)
数据框的
1
列,因此
1\ux
,您的
2
列是
d4(=y)
数据框的
0
列,因此
0\uy
。Pandas不知道你想叫它
2
,但它肯定知道这个栏目的来源,并相应地给栏目命名。@cel在“编辑1好的问题”中回答。通过第一个示例中的merge命令,我们知道0、0_x和1_y将具有相同的值。从您的第二个示例中,我们知道0、0_x和0_y将具有相同的值。但这一次熊猫似乎注意到了这一点,并且没有报告0_x和0_y。让我们看看是否有人知道一个很好的解释。熊猫的行为有点混乱,那么如何在示例1中创建3x3数据帧?