我有一个包含字段unique_id,sexy,born_at(生日)的人员列表,并且我尝试按性别和年龄段进行分组,并计算每个细分中的行。
无法弄清楚为什么我一直将NaN或0作为每个分段的输出。
这是我采用的最新方法...
数据样本:
|---------------------|------------------|------------------|
| unique_id | sex | born_at |
|---------------------|------------------|------------------|
| 1 | M | 1963-08-04 |
|---------------------|------------------|------------------|
| 2 | F | 1972-03-22 |
|---------------------|------------------|------------------|
| 3 | M | 1982-02-10 |
|---------------------|------------------|------------------|
| 4 | M | 1989-05-02 |
|---------------------|------------------|------------------|
| 5 | F | 1974-01-09 |
|---------------------|------------------|------------------|
代码:
df[‘num_people’]=1
breakpoints = [18,25,35,45,55,65]
df[[‘sex’,’born_at’,’num_people’]].groupby([‘sex’,pd.cut(df.born_at.dt.year, bins=breakpoints)]).agg(‘count’)
我尝试使用agg类型进行求和,使用相同的pd.cut函数从数据系列中删除NaN,pivot_table,但没有运气。猜测还有一种更好的方法可以完成此操作,而无需创建1列。
输出中不需要多余的born_at列,我还希望年龄段为18至24、25至34等,而不是18至25、25至35等,但是我我不确定该如何指定。
答案 0 :(得分:1)
我认为您错过了当前年龄的计算。您定义的用于分割bithday年的范围仅在使用它们来计算当前年龄时才有意义(否则所有分组的单元格将分别为nan或0,因为样本中的最小值为1963,最右边的最大值为65) 。首先,您要计算年龄:
datetime.now().year-df.birthday.dt.year
然后,此信息可用于对数据进行分组(先前已按性别分组):
df.groupby(['gender', pandas.cut(datetime.now().year-df.birthday.dt.year, bins=breakpoints)]).agg('count')
要摆脱nan单元格,您只需执行以下fillna(0)即可:
df.groupby(['gender', pandas.cut(datetime.now().year-df.birthday.dt.year, bins=breakpoints)]).agg('count').fillna(0).rename(columns={'birthday':'count'})