Python 如果左、右df';她的钥匙不同
我发现,若左键索引和右键索引不同,那个么熊猫合并方法的工作会很奇怪 例如,我定义了左数据帧和右数据帧,如下所示 左Python 如果左、右df';她的钥匙不同,python,pandas,join,merge,Python,Pandas,Join,Merge,我发现,若左键索引和右键索引不同,那个么熊猫合并方法的工作会很奇怪 例如,我定义了左数据帧和右数据帧,如下所示 左 0 1 2 3 4 5 0 1 2 1 2 3 4 1 2 3 2 3 4 5 2 1 2 3 4 5 6 3 2 2 4 5 6 7 4 2 3 5 6 7 8 右图 0 1 2 3 4 5 0 1 2 3 4 5 6 1 1 2 3 4 5 7 2 2 3
0 1 2 3 4 5
0 1 2 1 2 3 4
1 2 3 2 3 4 5
2 1 2 3 4 5 6
3 2 2 4 5 6 7
4 2 3 5 6 7 8
右图
0 1 2 3 4 5
0 1 2 3 4 5 6
1 1 2 3 4 5 7
2 2 3 4 5 6 7
3 2 3 4 5 6 8
并使用一些参数进行合并作业
pd.merge(left_df, right_df, how="inner", left_on = [0,1], right_on=[0,1], indicator=False)
结果与预期一致
0 1 2_x 3_x 4_x 5_x 2_y 3_y 4_y 5_y
0 1 2 1 2 3 4 3 4 5 6
1 1 2 1 2 3 4 3 4 5 7
2 1 2 3 4 5 6 3 4 5 6
3 1 2 3 4 5 6 3 4 5 7
4 2 3 2 3 4 5 4 5 6 7
5 2 3 2 3 4 5 4 5 6 8
6 2 3 5 6 7 8 4 5 6 7
7 2 3 5 6 7 8 4 5 6 8
但若我在参数上设置left_和right_的方式不同,结果会变得非常奇怪,如下所示
merge job with '1,2' left key index
pd.merge(left_df, right_df, how="inner", left_on = [1,2], right_on=[0,1], indicator=False)
1 2 0_x 1_x 2_x 3_x 4_x 5_x 0_y 1_y 2_y 3_y 4_y 5_y
0 2 3 1 2 3 4 5 6 2 3 4 5 6 7
1 2 3 1 2 3 4 5 6 2 3 4 5 6 8
^ ^ ^ ^
these columns are duplicated.
0_x 1 2 3_x 4_x 5_x 2_y 3_y 4_y 5_y
0 1 2 3 4 5 6 4 5 6 7
1 1 2 3 4 5 6 4 5 6 8
this is what I expected. (keys of each df are removed.)
是否有任何参数或方法可以解决上述问题 我想知道我提到的奇怪结果发生的条件,所以我将自己的假设分为两种情况
- 当每个键的列名不同时
- 当每个键的列索引(在本例中为数据帧中的绝对列位置)不同时
left_df
0 key0 key1 3 4 5
0 1 2 1 2 3 4
1 2 3 2 3 4 5
2 1 2 3 4 5 6
3 2 2 4 5 6 7
4 2 3 5 6 7 8
right_df
key0 key1 2 3 4 5
0 1 2 3 4 5 6
1 1 2 3 4 5 7
2 2 3 4 5 6 7
3 2 3 4 5 6 8
result
0 key0 key1 3_x 4_x 5_x 2 3_y 4_y 5_y
0 1 2 3 4 5 6 4 5 6 7
1 1 2 3 4 5 6 4 5 6 8
下面是简单的代码实现
key_entry = []
for i in range(len([1,2])):
key_entry.append('key' + str(i))
left_rename_map = {}
for i, each in zip([1,2], key_entry):
left_rename_map[i] = each
right_rename_map = {}
for i, each in zip([0,1], key_entry):
right_rename_map[i] = each
df1 = df1.rename(columns=left_rename_map)
df2 = df2.rename(columns=right_rename_map)
在我看来,熊猫会尝试保存所有列信息(在本例中为列名)。所以,若键的列名不同,Pandas认为该列不相同,并且不会删除键列,尽管该列的每个值都相同