Python 为什么使用合并操作生成的数据帧不是3x3维而不是3x5维?
我按照说明进行操作,但是当合并列不具有相同的索引时,我会感到困惑。例如,d3中的列1对应于d4中的列1Python 为什么使用合并操作生成的数据帧不是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
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数据帧?