如何在pandas中并行处理子数据帧

时间:2021-04-15 08:59:35

标签: pandas pyspark

df = pd.read_csv("imeis_events_march.csv")
imeis = df['imei'].unique().tolist()
for imei in imeis:
    dfj = df.loc[df['imei']==imei]
    # calculate feature
    props = calculate_ratio(dfj) 

我想使用 calculate_ratio 函数以高效的方式处理每个子数据帧。 有什么好的方法可以并行实现吗? 想要的结果是

<块引用>

imei:道具

对于每个 imei。

1 个答案:

答案 0 :(得分:0)

您可以创建一个 PySpark 数据帧,通过 imei group,然后使用 applyInPandas 将每个组作为单独的 Pandas 数据帧并行处理:< /p>

pdf = pd.read_csv("imeis_events_march.csv")
df = spark.createDataFrame(pdf)

def calculate_ratio(pandas_df):
    pandas_df['ratio'] = 1.0 #implement the real logic here
    return pandas_df

schema_with_ratio = "imei string, ...other columns..., ratio float"

df.groupBy("imei").applyInPandas(calculate_ratio, schema_with_ratio).show()

calculate_ratio 将由 Spark 使用 Pandas 数据帧为输入数据中的每个 imei 调用一次。

这种方法的一个缺点是每组 imei 必须完全适合一个 Spark 执行程序的内存,否则会发生 OutOfMemory 错误。