我发现pandas Merge方法如果左右的键索引不同。
对于实例,我将左右数据框架定义为以下内容
left_df
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
right_df
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_on和right_on参数,结果会变得非常奇怪。
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认为列不同,并且尽管每个值都相同,但它不会删除键列。