我有以下数据框:
df = pd.DataFrame([
(A, A, 'Cat'),
(A, A, 'Dog'),
(A, A, 'Cat'),
(A, B, 'Dog'),
(B, B, 'Rat'),
(B, C, 'Cat'),
(B, C, 'Cat')
], columns=['id', 'group', 'Animal'])
我想通过'id'和'group'对其进行分组,并计算每组中'Cat'的出现次数。示例输出将是:
[2, 0 ,0, 2]
(AA组2'猫',AB组0'猫',BB组0'猫',BC组2'猫')
有人可以帮忙吗?谢谢!
答案 0 :(得分:2)
您需要mask
+ groupby
:
df.Animal = df.Animal.mask(df.Animal.ne('Cat'))
df.groupby(['id', 'group']).Animal.count().tolist()
[2, 0, 0, 2]
答案 1 :(得分:2)
您可以使用value_counts
df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0).loc[:,'Cat'].tolist()
Out[144]: [2, 0, 0, 2]
更多信息在最后一步之前返回.loc
df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0)
Out[145]:
Animal Cat Dog Rat
id group
A A 2 1 0
B 0 1 0
B B 0 0 1
C 2 0 0
答案 2 :(得分:1)
您的问题与此 question 非常相似(如果不重复)。
当您想要执行一些不属于 Pandas 的聚合(例如 sum
、max
、min
)时,您应该使用 apply method。
请注意,apply
可能会更慢,所以不要到处使用。
现在,对于你的问题,你从分组开始:
df.groupby(by=["id", "group"])
然后,您从组中选择 Animal
列:
df.groupby(by=["id", "group"])['Animal']
此时,您有来自每个不同组的 Animal
列的值,可以进行任何聚合。
让我们定义一个函数来计算 Pandas Cat
中的 Series
:
def count_cat(series):
return (series == 'Cat').sum()
您现在要做的就是将此函数传递给 apply
方法,如下所示:
df.groupby(by=["id", "group"])['Animal'].apply(count_cat).reset_index(name='count_cat')
结果是:
id | 组 | count_cat | |
---|---|---|---|
0 | A | A | 2 |
1 | A | B | 0 |
2 | B | B | 0 |
3 | B | C | 2 |
答案 3 :(得分:0)
如果0个值不重要,则可以尝试:
solution <-
data.frame(
date = seq(min(source_data$start), max(source_data$end), by = 1)
)
对不起,我的英语