Bra*_*mon 6 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"),
})
Run Code Online (Sandbox Code Playgroud)
在 中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
Run Code Online (Sandbox Code Playgroud)
这是实际结果:
>>> df.groupby(["state", "gender"])["name"].count()
state gender
AK M 2
AL F 1
M 1
Name: name, dtype: int64
Run Code Online (Sandbox Code Playgroud)
我误解了这里的描述吗?
此解决办法似乎是一个巨大的疼痛,到底是什么应该被创建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
Run Code Online (Sandbox Code Playgroud)
似乎你把["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
Run Code Online (Sandbox Code Playgroud)
以下是一些有用的变体:
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
Run Code Online (Sandbox Code Playgroud)
我同样不确定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
Run Code Online (Sandbox Code Playgroud)