簡體   English   中英

Pandas Groupby:具有多個類別的“已觀察”參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM