在PySpark数据框中为特定单元格分配值

2024-04-29 10:03:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用PySpark更改我的Spark DataFrame特定单元格中的值。在

小例子-我创建了一个模拟Spark DataFrame

df = spark.createDataFrame(
    [
     (1, 1.87, 'new_york'), 
     (4, 2.76, 'la'), 
     (6, 3.3, 'boston'), 
     (8, 4.1, 'detroit'), 
     (2, 5.70, 'miami'), 
     (3, 6.320, 'atlanta'), 
     (1, 6.1, 'houston')
    ],
    ('variable_1', "variable_2", "variable_3")
)

运行display(df)我得到这个表:

^{pr2}$

{I{I}为第3行指定一个新值。我知道作为df.iloc[4, 3] = 'new_orleans'df.loc[4, 'detroit'] = 'new_orleans'的赋值在Spark中无效。在

使用when回答我的问题的有效答案是:

from pyspark.sql.functions import when
targetDf = df.withColumn("variable_3", \
              when(((df["variable_1"] == 8) & (df["variable_2"] == 4.1)) , 'new_orleans').otherwise(df["variable_3"]))

我的问题是:是否可以在PySpark中以更实际的方式完成此操作,而不必输入我只想更改一个单元格的行的所有值和列名(可能在不使用when函数的情况下实现相同的结果)?在

感谢用户@98064的反馈和帮助。在


Tags: dataframedfnewbostonvariablela例子spark
2条回答

可以使用底层RDD创建行号:

from pyspark.sql import Row

# Function to update dataframe row with a rownumber
def create_rownum(ziprow):
    row, index=ziprow
    row=row.asDict()
    row['rownum']= index
    return(Row(**row))

# First create a rownumber then add to dataframe
df.rdd.zipWithIndex().map(create_rownum).toDF().show()

现在可以过滤DataFrame以获得所需的行号。在

SparkDataFrames是不可变的不提供随机访问,严格地说是无序的。因此:

  • 你不能分配任何东西(因为不可变的属性)。在
  • 无法访问特定行(因为没有随机访问)。在
  • 行“索引”定义不好(因为无序)。在

你能做的是,用新列创建一个新的数据帧,用一些条件表达式替换现有的数据帧,这些条件表达式已经包含在你找到的答案中。在

而且,monotonically_increasing_id不添加索引(行号)。它添加单调递增的数字,不一定是连续的或从任何特定值开始(如果是空分区)。在

相关问题 更多 >