如何使用多个值更改spark中DataFrame的na值

时间:2017-12-13 01:33:57

标签: python spark-dataframe

我有一个有时为空值的数据框,我想用一系列值中的单个值(例如0到100之间的随机整数)替换,而不是总是相同的值。

na.fill()功能似乎不允许这样做,我找不到手动执行此操作的好方法。
我在Python& Spark 2.2

2 个答案:

答案 0 :(得分:0)

逐个浏览每个单元格,检查该值是否为空,如果是,则将其更改为随机数。

首先,随机导入。然后是:

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

答案 1 :(得分:0)

我终于提出了以下解决方案,希望它可以帮助我解决一些具体的需求,即从数据帧的列中删除空值并用随机值替换它们:

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)

如何调用该方法:

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

这里dfAmodel是一个新的数据帧,其行数与来自输入数据帧df1的A列的空值一样多。只有A的空值会被更改,其他列会被更改。价值保持不变。

其他: exec()非常有用,因为它从字符串执行代码。
解决方案的优势在于能够根据需要重复使用此方法,只需将您想要的数据框更改为输入,指定要考虑的列以及从中获取新闻值的公式。