在 pandas 中,如何在缺少类别的分类系列上旋转数据框?

In pandas, how to pivot a dataframe on a categorical series with missing categories?

我有一个 pandas 数据框,其中包含缺少类别的分类系列。

在下面显示的示例中,group 具有类别 "a""b""c",但没有 "c" 的情况数据框。

import pandas as pd
dfr = pd.DataFrame({
    "id": ["111", "222", "111", "333"], 
    "group": ["a", "a", "b", "b"], 
    "value": [1, 4, 9, 16]})
dfr["group"] = pd.Categorical(dfr["group"], categories=["a", "b", "c"])
dfr.pivot(index="id", columns="group")

生成的旋转数据框包含 ab 列。我希望 c 列也包含所有缺失值。

      value      
group     a     b
id               
111     1.0   9.0
222     4.0   NaN
333     NaN  16.0

如何在分类系列上旋转数据框以包括所有类别的列,而不管它们是否存在于原始数据框中?

pd.pivot_table 有一个 dropna 参数,它指示删除或不删除充满 NaN 的值列。

尝试将其设置为 False:

import pandas as pd
dfr = pd.DataFrame({
    "id": ["111", "222", "111", "333"], 
    "group": ["a", "a", "b", "b"], 
    "value": [1, 4, 9, 16]})
dfr["group"] = pd.Categorical(dfr["group"], categories=["a", "b", "c"])
pd.pivot_table(dfr, index="id", columns="group", dropna=False)

你可以reindex。即使您的 value 列不是数字(与 pivot_table 不同),这也会起作用:

output = (dfr.pivot(index="id", columns="group")
             .reindex(columns=pd.MultiIndex.from_product([["value"],
                                                          dfr["group"].cat.categories]
                                                         )
                      )
             )

>>> output
    value          
        a     b   c
id                 
111   1.0   9.0 NaN
222   4.0   NaN NaN
333   NaN  16.0 NaN