熊猫groupby函数返回NaN值

时间:2018-07-12 21:22:48

标签: python pandas pandas-groupby

我有一个包含字段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列。

所需的输出将是这样的... enter image description here

输出中不需要多余的born_at列,我还希望年龄段为18至24、25至34等,而不是18至25、25至35等,但是我我不确定该如何指定。

1 个答案:

答案 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'})