2016-11-21 10 views
0

をしてクラスタを取得するためにデータフレームを渡すための空の文字列を持つことはできませんpyspark mlのエラー-u'requirementに失敗しました:名」私は以下のコードでスパークミリリットルの関数kmeansモデルを作成しようとしています

def pre_process_data_for_kmean(dataframe): 
    train_data = dataframe.select(col("custid"),col("amount").cast("double").alias("amnt"),col("trantype"),((col("trantime"))).cast("double").alias("date_time")) 
    cat1Indexer = StringIndexer(inputCol="custid", outputCol="indexedCat1", handleInvalid="skip") 
    cat2Indexer = StringIndexer(inputCol="trantype", outputCol="indexedCat2", handleInvalid="skip") 
    cat1Encoder = OneHotEncoder(inputCol="indexedCat1", outputCol="CatVector1") 
    cat2Encoder = OneHotEncoder(inputCol="indexedCat2", outputCol="CatVector2") 
    cat3Encoder = OneHotEncoder(inputCol="date_time",outputCol="CatVector3") 
    fAssembler = VectorAssembler(
    inputCols=["CatVector1","CatVector2","CatVector3","amnt"], 
    outputCol="C5") 
    cluster_model = KMeans(k=10, seed=1,featuresCol="C5") 
    cluster_pipeline = Pipeline(stages=[cat1Indexer, cat1Encoder,cat2Indexer,cat2Encoder,cat3Encoder,fAssembler]) 
    cluster_model = cluster_pipeline.fit(train_data) 
    return cluster_model 

私は今、私はoneHotEncoderが空の文字列を受け入れないことを理解し、私が既に持っているあなたが見ることができるように、そのに対抗するための措置をとる

train_df = raw_train_df.select(col("dSc").alias("custid"),col("TranAmount").alias("amount"),col("TranDescription").alias("trantype"),func.dayofmonth(col("BusinessDate")).alias("trantime")).na.fill({'trantype':'new_tran_type','custid':'-99999','amount':0,'trantime':1}).dropna() 

    cluster_model = pre_process_data_for_kmean(train_df) 

としてデータフレームを渡しています。しかし、私はまだこのエラーに直面している

助けてください。

答えて

1

空の文字列は、文字通り空の文字列ではなく、NULLです。 na.filldropnaも役に立ちません。 na.replaceを使用することができますが、それは私が知っている限り、それは列方向に等価ではないので、各列に対してそれを呼び出さなければなりません:

replacements = { 
    'some_col': 'some_replacement', 'another_col': 'another_replacement', 
    'numeric_column_wont_be_replaced': 1.0 
} 

for k, v in replacements.items(): 
    # We can replace string only if target is string 
    # In Python 2 str -> basestring 
    if isinstance(v, str): 
     df = df.na.replace("", v, [k]) 
関連する問題