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