如何将 pandas 嵌套列复制到另一个 DF?
How do I copy pandas nested column to another DF?
我们在具有嵌套结构的 Delta 源中有一些数据。对于此示例,我们关注 Delta 中名为 status
的特定字段,该字段具有多个子字段:commissionDate
、decommissionDate
、isDeactivated
、isPreview
, 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
,现在有 commissiondate
、decomissiondate
等的列
我们在具有嵌套结构的 Delta 源中有一些数据。对于此示例,我们关注 Delta 中名为 status
的特定字段,该字段具有多个子字段:commissionDate
、decommissionDate
、isDeactivated
、isPreview
, 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
,现在有 commissiondate
、decomissiondate
等的列