Python 使用字典连接vs映射以向Pandas/PySpark数据帧添加新数据?

Python 使用字典连接vs映射以向Pandas/PySpark数据帧添加新数据?,python,pandas,pyspark,Python,Pandas,Pyspark,我有一个大数据框,其中有一个气象列,可以获取5个不同的值(晴天、多云、雨、雪和其他)。我必须添加另一列,其中包含更多信息,这些信息完全取决于天气值(例如,如果是晴天,则在新列中添加值x,如果是阴天,则添加值y…) 我想知道做这件事的“更好”方法(更“标准”的方法)是什么。要么与另一个小数据框进行连接,该小数据框包含气象列(在此列上进行连接)和一个包含这些要添加的新值的“new_data”列(5行和2列),要么使用字典映射数据框的每一行,其中气象值作为键,新数据作为值添加。最后一种方法的示例如下所

我有一个大数据框,其中有一个气象列,可以获取5个不同的值(晴天、多云、雨、雪和其他)。我必须添加另一列,其中包含更多信息,这些信息完全取决于天气值(例如,如果是晴天,则在新列中添加值x,如果是阴天,则添加值y…)

我想知道做这件事的“更好”方法(更“标准”的方法)是什么。要么与另一个小数据框进行连接,该小数据框包含气象列(在此列上进行连接)和一个包含这些要添加的新值的“new_data”列(5行和2列),要么使用字典映射数据框的每一行,其中气象值作为键,新数据作为值添加。最后一种方法的示例如下所示:

new_data = {"sunny": x, "cloudy": y, "rain": z, "snow": m, "other": n}

# Pandas
df["new_column"] = df["weather"].apply(lambda x: new_data[x])

# PySpark
from pyspark.sql.functions import udf, col
from pyspark.sql.types import FloatType
add_weather_data_f = udf(lambda x: new_data[x], FloatType())
df = df.withColumn("new_column", add_weather_data_f(col("weather")))

使用Pandas数据帧或PySpark数据帧时,哪一种方法是“更好的”方法?

请不要在此处查看加入的原因。广播会很快,但我喜欢在处理大数据时尽可能避免加入

from pyspark.sql import functions as F

new_data=(['sunny','x'],['cloud','y'],['rain','z'],['snow','m'],['other','n'])
new_data1=(F.when(F.col('weather')==(x[0]), F.lit(x[1])) for x in new_data)
df.withColumn('new_column', F.coalesce(*new_data1)).show(truncate=False)

+-------+----------+
|weather|new_column|
+-------+----------+
|sunny  |x         |
|cloud  |y         |
|rain   |z         |
|snow   |m         |
|other  |n         |
+-------+----------+

广播加入一个小的df听起来像是一个可能的方法与斯巴克谢谢你的回应。如果我错了,请纠正我。在代码中,使用新的_data1生成所有天气变量的所有比较,然后选择匹配且没有NaN值的。在UDF的帮助下直接在字典(或元组列表等)中搜索实际值不是更有效吗(从而避免了coalesce函数的执行时间)?