python - Pandas Groupby:具有多个分类的“观察到”参数
问题描述
考虑以下具有两个分类列的 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
。(Pandas 0.25.0)的描述是:observed
当使用分类石斑鱼(作为单个石斑鱼,或作为多个石斑鱼的一部分)时,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
推荐阅读
- firebase-dynamic-links - 使用动态链接 API 获取原始链接
- javascript - 如何将 Google Recaptcha v2 实施到限制访问 Google Recaptcha 的 Web 应用程序
- python-3.x - python如何将id分配给字符串?
- bash - 使用 if else bash 脚本检查变量是否存在
- flutter - 如何动态本地化文本字段文本方向取决于用户输入到 rtl 或 ltr 方向
- javascript - Javascript中返回值的类型转换
- javascript - 更改主要内容而不更改整页
- python - PySNMP:如何在同一个代理中实现 CommandResponder 和 NotificationOriginator?
- reactjs - 没有根据反应中的状态变化触发 UseEffect
- reactjs - 在 Github 上托管后,带有 React 的 Twilio Chat API 无法正常工作