2017-12-13 8 views

답변

0

내가 마지막으로 다음과 같은 솔루션을 함께했다, 그것은 dataframe의 열에서 null 값을 제거하고 임의의 값으로 대체하는 것이었다 내가 가진 특정 필요성, 일부 도움이 될 희망

dfAmodel = newRow(("A","random.uniform(40, 80)"), df1) 
df2 = df1.na.drop(subset=['A']).union(dfAmodel) 

여기 dfAmodel만큼 소유주와 새로운 dataframe은 다음과 같습니다 : 메소드를 호출하는 방법

def newRow(model,dataframe): 
    rows=[] 
    limit = 0 
    exec("limit = dataframe.where(dataframe." + model[0] + ".isNull()).count()") 

    for i in range(0, limit): 
    x = "" 
    exec("x = dataframe.where(dataframe."+ model[0] +".isNull()).collect()[i]") 


    schema = StructType([StructField("A", StringType(), True), 
        StructField("B", StringType(), True), 
        StructField("C", StringType(), True), 
        StructField("D", StringType(), True), 
        StructField("E", StringType(), True)]) 
    A = None 
    B = None 
    C = None 
    D = None 
    E = None 

    if x["A"] != None and model[0] != "A": 
     A = x["A"].encode('ascii') 
    if x["B"] != None and model[0] != "B": 
     B = x["B"].encode('ascii') 
    if x["C"] != None and model[0] != "C": 
     C = x["C"].encode('ascii') 
    if x["D"] != None and model[0] != "D": 
     D = x["D"].encode('ascii')  
    if x["E"] != None and model[0] != "E": 
     E = x["E"].encode('ascii') 

    exec(model[0] + "=" + model[1]) 

    rows.append(Row(A, B, C, D, E)) 

    return sqlContext.createDataFrame(rows,schema) 
ws는 입력 데이터 프레임 df1에서 열 A의 Null 값입니다. A의 Null 값만 변경되고 다른 열의 값은 그대로 유지됩니다.

기타 : exec()는 문자열에서 코드를 실행함에 따라 매우 유용합니다.
솔루션의 강점은 원하는만큼의 데이터 프레임을 위해이 방법을 재사용 할 수 있다는 것입니다. 원하는 데이터 프레임을 변경하고 고려할 열과 뉴스 값을 가져올 공식을 지정하기 만하면됩니다.

0

이동 한 스파크 & 파이썬 작동
는 값이 널 그것이이면 난수로 변경되는지 확인한다.

먼저 임의로 가져 오기하십시오. 같은 그런 일이 :

df = df.where(df.a.isNull()).replace(null, random.randrange(min, max+1)) 
관련 문제