提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值
Posted
技术标签:
【中文标题】提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值【英文标题】:Extracting value of specific cell and populating it in place of NA values in pyspark dataframe 【发布时间】:2020-12-15 11:11:28 【问题描述】:我正在将 python 代码转换为 pyspark,在这里我尝试使用 fillna 并使用来自同一数据框的另一列但在索引 0 上的值填充 na 值
下面是我的正常工作的python代码:
df['Parent'].fillna(df.at[0, 'Sequence'], inplace=True)
之前的dataframe结构:
df:
A B Sequence Parent
QQQ AAA 0251
WWW SSS 0616
EEE DDD 0720 0616
RRR FFF 0807 0720
dataframe 之后的结构:
df:
A B Sequence Parent
QQQ AAA 0251 0251
WWW SSS 0616 0251
EEE DDD 0720 0616
RRR FFF 0807 0720
我尝试了以下方法:
df.collect()[0]['Sequence'] # This gives different value each time.
df.fillna(df.select("Sequence")[0], subset=['Parent']) # Syntax is not correct
欢迎提出任何建议。
【问题讨论】:
【参考方案1】:您可以使用 collect 方法执行此操作,但要过滤以获取您想要的值:
value = df.filter(df["A"] == "QQQ").collect()[0]['Sequence']
df = df.fillna(value, ["Parent"])
【讨论】:
数据框中列的内容是可变的,因此它们不能用于查询。还有其他方法吗? 您只需要文件的第一行。如果文件是 .csv,您可以直接读取第一行并获取值。另一种选择是将您的熊猫数据帧直接转换为火花数据帧或尝试在火花中限制,但我不知道它是否保留数据帧顺序。【参考方案2】:我假设您想使用序列的最小值来填充。请注意,Spark 没有索引的概念,所以像 at index 0
这样的说法是未定义的。您需要定义数据框的顺序,以便索引的概念有意义。
import pyspark.sql.functions as F
df2 = df.fillna(df.select(F.min("Sequence")).collect()[0][0], subset=['Parent'])
【讨论】:
以上是关于提取特定单元格的值并将其填充以代替 pyspark 数据框中的 NA 值的主要内容,如果未能解决你的问题,请参考以下文章
Excel VBA/Formula 用于根据 2 个其他单元格的值填充 3 个特定单元格