特定值计入groupby

时间:2018-04-09 03:52:37

标签: python pandas dataframe pandas-groupby

我有以下数据框:

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'猫')

有人可以帮忙吗?谢谢!

4 个答案:

答案 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 的聚合(例如 summaxmin)时,您应该使用 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)
  )

对不起,我的英语