![](/img/trans.png)
[英]How to replace values in multiple categoricals in a pandas DataFrame
[英]Pandas Groupby: 'observed' parameter with multiple categoricals
考慮以下具有兩個類別列的DataFrame:
df = pd.DataFrame({
"state": pd.Categorical(["AK", "AL", "AK", "AL"]),
"gender": pd.Categorical(["M", "M", "M", "F"]),
"name": list("abcd"),
})
在df.groupby()
,默認值為observed=False
。 observed
的描述 (熊貓0.25.0)為:
當使用分類石斑魚(作為單個石斑魚,或作為多個石斑魚的一部分)時,observed關鍵字控制是返回所有可能的石斑魚值的笛卡爾積 (observed = False)還是僅返回觀察到的石斑魚的笛卡爾積 (observed = True) )。
因此,這是我期望的結果:
>>> # Expected result
>>> df.groupby(["state", "gender"])["name"].count()
state gender
AK M 2
F 0
AL F 1
M 1
Name: name, dtype: int64
這是實際結果:
>>> df.groupby(["state", "gender"])["name"].count()
state gender
AK M 2
AL F 1
M 1
Name: name, dtype: int64
我在這里誤解說明嗎?
這種解決方法似乎是一個巨大的痛苦,確切地說, observed=False
應該創建什么。 我是否缺少其他選擇?
>>> idx = pd.MultiIndex.from_product(
... (
... df["state"].cat.categories,
... df["gender"].cat.categories,
... ),
... names=["state", "gender"]
... )
>>> df.groupby(["state", "gender"])["name"].count().reindex(idx).fillna(0.).astype(int)
state gender
AK F 0
M 2
AL F 1
M 1
Name: name, dtype: int64
好像您將["name"]
放在哪里一樣。 我認為這可行:
df.groupby(["state", "gender"]).count().fillna(0)["name"]
state gender
AK F 0.0
M 2.0
AL F 1.0
M 1.0
Name: name, dtype: float64
以下是一些有用的變體:
In [16]: df.groupby(["state", "gender"], observed=False).count().fillna(0)["name"].astype(int)
Out[16]:
state gender
AK F 0
M 2
AL F 1
M 1
Name: name, dtype: int64
In [17]: df.groupby(["state", "gender"], observed=True).count()["name"]
Out[17]:
state gender
AK M 2
AL M 1
F 1
Name: name, dtype: int64
我對observed
也同樣不確定。 但是,您想要的結果並不難得到。 .unstack(fill_value=0).stack()
。
>>> import pandas as pd
>>> df = pd.DataFrame({
... "state": pd.Categorical(["AK", "AL", "AK", "AL"]),
... "gender": pd.Categorical(["M", "M", "M", "F"]),
... "name": list("abcd"),
... })
>>> df.groupby(['state', 'gender'])['name'].count().unstack(fill_value=0).stack()
state gender
AK M 2
F 0
AL M 1
F 1
dtype: int64
使用crosstab
pd.crosstab(df.state,df.gender).stack()
state gender
AK F 0
M 2
AL F 1
M 1
dtype: int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.