繁体   English   中英

使用 pandas 聚合多列定性数据?

[英]Aggregate multiple columns of qualitative data using pandas?

我想从这个 go :

姓名 宠物
1 拉什达
2 拉什达
3 吉姆
4 吉姆

对此:

姓名 num_dogs num_cats
1 吉姆 2 0
2 拉什达 1 1

在 R 我会做

df %>% 
  group_by(name) %>% 
  summarize(num_dogs = length(which(pet == "dog")),
            num_cats = length(which(pet == "cat")))

我将如何使用 pandas 做到这一点?

有很多不同的方法可以做到这一点。

如果要过滤单个列的值,则可以将.agg 与自定义 lambda function 一起使用。

(df.groupby(["name"])
  .agg(
      num_dogs=("pet", lambda x: np.sum(x == "dog")), 
      num_cats=("pet", lambda x: np.sum(x == "cat")))
)

或者

(df
  .groupby(["name", "pet"])
  .size()
  .unstack("pet", fill_value=0)
  .add_prefix("num_").add_suffix("s")
)

您还可以使用 pivot 表。

df.reset_index().pivot_table(index="name", columns="pet", values="index", aggfunc="count", fill_value=0)

但是,如果您需要基于两列进行过滤,那么该方法将不起作用。 例如,如果您需要知道有多少只老狗。

df = pd.DataFrame({'name': ["Rashida", "Rashida", "Joe", "Joe"],
                   'pet': ['dog', 'cat', 'dog', 'dog'],
                   'age': ["old", "old", "old", "young"]})

您可以使用 pivot 表。

df.reset_index().pivot_table(index="name", columns=["pet", "age"], values="index", aggfunc="count", fill_value=0)

或交叉表。

pd.crosstab(df["name"], [df["pet"], df["age"]], dropna=False).unstack().reset_index()

或者,您可以使用名为 siuba 的 Dplyr 端口来模仿原始的 R 语法,但我还没有充分使用它,不知道如何很好地使用它。

from siuba import group_by, summarize, _

您可以使用由datar支持的 datar :

>>> from datar.all import f, tribble, length, group_by, which, summarise
>>> 
>>> df = tribble(
...     f.name,    f.pet,
...     "Rashida", "dog",
...     "Rashida", "cat",
...     "Jim",     "dog",
...     "Jim",     "dog",
... )
>>> 
>>> df >> group_by(f.name) >> summarise(
...     num_dogs = length(which(f.pet == "dog")),
...     num_cats = length(which(f.pet == "cat"))
... )
      name  num_dogs  num_cats
  <object>   <int64>   <int64>
0      Jim         2         0
1  Rashida         1         1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM