在 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")
生成的旋转数据框包含 a
和 b
列。我希望 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
我有一个 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")
生成的旋转数据框包含 a
和 b
列。我希望 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