use*_*403 3 python dataframe pandas 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'])
Run Code Online (Sandbox Code Playgroud)
我把它通过想组id和group和计算的发生Cat各小组。示例输出将是:
[2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)
2cat人一组AA,
0cat组AB,
0cat组BB,
2cat人一组BC
任何人都可以帮忙吗?谢谢!
你需要mask+ groupby:
df['Animal'] = df['Animal'].mask(df['Animal'].ne('Cat'))
df.groupby(['id', 'group'])['Animal'].count().tolist()
Run Code Online (Sandbox Code Playgroud)
[2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)
您可以使用 value_counts
df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0).loc[:,'Cat'].tolist()
Out[144]: [2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)
在最后一步之前返回更多信息 .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
Run Code Online (Sandbox Code Playgroud)
您的问题与此问题非常相似(如果不重复)。
当您想要执行一些不属于 pandas 的聚合(例如sum,,)时,您应该使用apply 方法。maxmin
请注意,这apply 可能会比较慢,所以不要开始到处使用。
现在,对于您的问题,您从分组依据开始:
df.groupby(by=["id", "group"])
Run Code Online (Sandbox Code Playgroud)
Animal然后,从组中选择列:
df.groupby(by=["id", "group"])['Animal']
Run Code Online (Sandbox Code Playgroud)
此时,您已从Animal每个不同组的列中获得了值,可以进行任何聚合。
让我们定义一个函数来计算Catpandas 中的 s Series:
def count_cat(series):
return (series == 'Cat').sum()
Run Code Online (Sandbox Code Playgroud)
您现在要做的就是将此函数传递给该apply方法,如下所示:
df.groupby(by=["id", "group"])['Animal'].apply(count_cat).reset_index(name='count_cat')
Run Code Online (Sandbox Code Playgroud)
结果是:
| ID | 团体 | 计数猫 | |
|---|---|---|---|
| 0 | A | A | 2 |
| 1 | A | 乙 | 0 |
| 2 | 乙 | 乙 | 0 |
| 3 | 乙 | C | 2 |
| 归档时间: |
|
| 查看次数: |
6879 次 |
| 最近记录: |