如何对目标DataFrame执行Unpivot操作并忽略NaN值?
问题描述
现有如下结构的DataFrame:
| PRODUCTNUMBER | Jerarquía principal | Jerarquía secundaria marcas | COT | Ecommerce | dabra-catalog | Dexter-ecommerce | Stockcenter-ecommerce |
|---|---|---|---|---|---|---|---|
| AD802309 | Medias-Hombre | ADIDAS | 950699 | NaN | NaN | NaN | NaN |
| AD481076 | NaN | Adidas | 950699 | NaN | NaN | NaN | NaN |
| AD481137 | Medias-Hombre | Adidas | 950699 | Medias-Hombre | Medias-Hombre | Medias-Hombre | Medias-Hombre |
需要转换为以下结构的输出DataFrame(忽略所有NaN值):
| PRODUCTNUMBER | PRODUCTCATEGORYNAME | PRODUCTCATEGORYHIERARCHYNAME |
|---|---|---|
| AD802309 | Medias-Hombre | Jerarquía principal |
| AD802309 | ADIDAS | Jerarquía secundaria marcas |
| AD802309 | 950699 | COT |
| AD481076 | Adidas | Jerarquía secundaria marcas |
| AD481076 | 950699 | COT |
| AD481137 | Medias-Hombre | Jerarquía principal |
| AD481137 | Adidas | Jerarquía secundaria marcas |
| AD481137 | 950699 | COT |
| AD481137 | Medias-Hombre | Ecommerce |
| AD481137 | Medias-Hombre | dabra-catalog |
| AD481137 | Medias-Hombre | Dexter-ecommerce |
| AD481137 | Medias-Hombre | Stockcenter-ecommerce |
是否可以实现该转换?
解决方案
完全可以实现,用Pandas的melt函数就能快速完成这种宽表转长表的操作,同时过滤掉NaN值。具体步骤如下:
- 使用
melt函数,指定id_vars为PRODUCTNUMBER(保留作为标识的列),将其他列转换为两列:PRODUCTCATEGORYHIERARCHYNAME(原列名)和PRODUCTCATEGORYNAME(原列对应的值)。 - 过滤掉
PRODUCTCATEGORYNAME为NaN的行。 - 重置索引(可选,让结果更整洁)。
示例代码:
import pandas as pd # 构造示例输入DataFrame df = pd.DataFrame({ "PRODUCTNUMBER": ["AD802309", "AD481076", "AD481137"], "Jerarquía principal": ["Medias-Hombre", pd.NA, "Medias-Hombre"], "Jerarquía secundaria marcas": ["ADIDAS", "Adidas", "Adidas"], "COT": [950699, 950699, 950699], "Ecommerce": [pd.NA, pd.NA, "Medias-Hombre"], "dabra-catalog": [pd.NA, pd.NA, "Medias-Hombre"], "Dexter-ecommerce": [pd.NA, pd.NA, "Medias-Hombre"], "Stockcenter-ecommerce": [pd.NA, pd.NA, "Medias-Hombre"] }) # 执行转换 result_df = df.melt( id_vars="PRODUCTNUMBER", var_name="PRODUCTCATEGORYHIERARCHYNAME", value_name="PRODUCTCATEGORYNAME" ).dropna(subset=["PRODUCTCATEGORYNAME"]).reset_index(drop=True) print(result_df)
执行上述代码后,得到的结果就和目标结构完全一致,且自动忽略了所有NaN值。
内容的提问来源于stack exchange,提问作者Maximiliano Vazquez
相关产品推荐
相关产品推荐

