如何将 pandas 嵌套列复制到另一个 DF?

How do I copy pandas nested column to another DF?

我们在具有嵌套结构的 Delta 源中有一些数据。对于此示例,我们关注 Delta 中名为 status 的特定字段,该字段具有多个子字段:commissionDatedecommissionDateisDeactivatedisPreview, terminationDate.

在我们的转换中,我们目前使用 PySpark 读取 Delta 文件,使用 df.toPandas() 将 DF 转换为 pandas 并使用 pandas 对此 pandas DF 进行操作API。一旦我们有了这个 pandas DF,我们就想在不使用行迭代的情况下访问它的字段。

Pandas中的数据在使用inventory_df["status"][0]查询时如下所示(即inventory_df["status"]是一个列表):

Row(commissionDate='2011-07-24T00:00:00+00:00', decommissionDate='2013-07-15T00:00:00+00:00', isDeactivated=True, isPreview=False, terminationDate=None)

我们发现使用行迭代的成功,如:

unit_df["Active"] = [
        not row["isDeactivated"] for row in inventory_df["status"]
    ]

但是每次我们想要从 inventory_df 访问数据时,我们都必须使用行迭代。这更冗长且效率较低。

我们希望能够做类似的事情:

unit_df["Active"] = [
        not inventory_df["status.isDeactivated"]
    ]

这类似于 Spark 解构方法,并允许一次访问所有行,但似乎没有等效的 pandas 逻辑。

PySpark 中的数据格式类似于 status: struct<commissionDate:string,decommissionDate:string,isDeactivated:boolean,isPreview:boolean,terminationDate:string>,我们可以使用上面提到的格式,选择一个子列,例如 df.select("status.isDeactivated")

如何使用 pandas 完成此方法?

这可能会将您带到您认为自己所在的位置:

unit_df["Active"] = unit_df["Active"].apply(lambda x: pd.DataFrame(x.asDict()))

从这里我会做:

unit_df = pd.concat([pd.concat(unif_df["Active"], ignore_index=True), unit_df], axis=1)

这会给你一个单数 pd.DataFrame,现在有 commissiondatedecomissiondate 等的列