python - Pandas Groupby : 'observed' parameter with multiple categoricals

标签 python python-3.x pandas

考虑以下具有两个分类列的 DataFrame:

df = pd.DataFrame({
    "state": pd.Categorical(["AK", "AL", "AK", "AL"]),
    "gender": pd.Categorical(["M", "M", "M", "F"]),
    "name": list("abcd"),
})

df.groupby()中,默认值为observed=Falsedescription对于观察(Pandas 0.25.0)是:

When using a Categorical grouper (as a single grouper, or as part of multiple groupers), the observed keyword controls whether to return a cartesian product of all possible groupers values (observed=False) or only those that are observed groupers (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

关于python - Pandas Groupby : 'observed' parameter with multiple categoricals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385009/

相关文章:

python - 无法导入 PyQt4.QtGui

python - django中的日期时间显示和时区转换

Python - append 到 CSV

python - 使用 LIKE 子句的 Psycopg2 SQL 注入(inject)安全性

c++ - 加速一个长的 python 代码,该代码被证明仅由于单个 block 而变慢

css - 使用 BeautifulSoup 时丢失信息

python - 连接两个具有不同值的数据帧

python-3.x - Python asyncio 训练练习

python - 如何重新采样/重新组织数据框

python - 使用实际值创建虚拟列