我想使用Spark DataFrame
更改PySpark
的特定单元格中的值。
琐碎的例子 - 我创建了一个模拟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")
)
Runnning display(df)
我得到了这张表:
variable_1 variable_2 variable_3
1 1.87 new_york
4 2.76 la
6 3.3 boston
8 4.1 detroit
2 5.7 miami
3 6.32 atlanta
1 6.1 houston
例如,我想说,我想为第4行和第3列中的单元格分配一个新值,即更改detroit
的{{1}}。我知道new_orleans
或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"]))
中以更实际的方式完成,而无需输入我想要更改1个单个单元格的行的所有值和列名称(可能实现相同)不使用PySpark
函数)?
提前感谢您的帮助和@ useruser9806664的反馈。
答案 0 :(得分:3)
Spark DataFrames
不可变,不提供随机访问,严格来说,无序。结果:
您可以做的是创建一个包含新列的新数据框,使用一些条件表达式替换现有数据,这已经被您找到的答案所涵盖。
此外,monotonically_increasing_id
不会添加索引(行号)。它会增加单调递增的数字,不一定是连续的数字或从任何特定值开始(如果是空分区)。
答案 1 :(得分:0)
您可以使用基础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以获取所需的行号。