列排序导致的Python H2OFrame合并行为不一致

时间:2019-06-13 15:49:47

标签: python python-3.x h2o

我有以下要导入到H2OFrames中的CSV文件。

CSV 1(a):

year,manufacturer,model,salePrice
2010,HONDA,CIVIC,100
2011,TOYOTA,CAMRY,150
2010,HONDA,CIVIC,50
2011,TOYOTA,CAMRY,200
2010,HONDA,CIVIC,150
2011,TOYOTA,CAMRY,250
2012,SUZUKI,SWIFT,500
2012,SUZUKI,SWIFT,600

CSV 1(b):

manufacturer,model,year,salePrice
HONDA,CIVIC,2010,100
TOYOTA,CAMRY,2011,150
HONDA,CIVIC,2010,50
TOYOTA,CAMRY,2011,200
HONDA,CIVIC,2010,150
TOYOTA,CAMRY,2011,250
SUZUKI,SWIFT,2012,500
SUZUKI,SWIFT,2012,600

CSV 2:

year,manufacturer,model,bodyType
2010,HONDA,CIVIC,SEDAN
2011,TOYOTA,CAMRY,SEDAN
2012,SUZUKI,SWIFT,HATCHBACK

请注意,“ 1a”和“ 1b”是完全相同的数据,只是列顺序不同。现在,我将它们全部三个导入H2OFrame中,如下所示:

import h2o
h2o.init()
df1a=h2o.import_file('csv1a.csv')
df1b=h2o.import_file('csv1b.csv')
df2=h2o.import_file('csv2.csv')

然后尝试以下合并操作:

merge1=df1a.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])
merge2=df1b.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])

第一次合并按预期方式进行。但是第二个失败,并显示错误“合并列必须是同一类型,列salePrice发现类型为Enum和Numeric”

当我检查h2o服务器上的日志时,发现尽管发送给服务器的by_x列索引对于两个合并(和排序-[0 1 2])来说都是完全相同的by_x列在df1b中出现的顺序不同。从服务器日志中。

parms={ast=(tmp= py_5_sid_abdb (merge h2o_bug_df1b1.hex h2o_bug_df21.hex False False [0 1 2] [0 1 2] 'auto'))

然后我在h2o.frame模块的代码中找到#1967和#3422行: https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L1967 https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L3422

对于我的第二次合并,by_x列索引应该是[2 0 1],相反,由于#3422行中的[0 1 2]语句,python客户端发送了list(set(tmp))

所以我想知道,如果提供的by_xby_y的列名不是唯一的,而不是将它们收集到{{ 1}}显然不会保留顺序?

在我检查代码之前,该错误消息是令人误解的,因为该消息引用了setsalePrice中都没有的by_x列。

0 个答案:

没有答案