Python 巨蟒
编辑:添加了灵巧 使用Python 巨蟒,python,pandas,Python,Pandas,编辑:添加了灵巧 使用pandas.cut是否会更改pandas.DataFrame的结构 我正在使用pandas.cut以以下方式将单个年龄段映射到年龄组,然后进行聚合。但是,聚合不起作用,因为我在所有要聚合的列中都使用了NaN。这是我的密码: cutoff = numpy.hstack([numpy.array(defT.MinAge[0]), defT.MaxAge.values]) labels = defT.AgeGrp df['ageGrp'] = pandas.cut(df.
pandas.cut
是否会更改pandas.DataFrame
的结构
我正在使用pandas.cut
以以下方式将单个年龄段映射到年龄组,然后进行聚合。但是,聚合不起作用,因为我在所有要聚合的列中都使用了NaN
。这是我的密码:
cutoff = numpy.hstack([numpy.array(defT.MinAge[0]), defT.MaxAge.values])
labels = defT.AgeGrp
df['ageGrp'] = pandas.cut(df.Age,
bins = cutoff,
labels = labels,
include_lowest = True)
这里是灵巧的:
AgeGrp MaxAge MinAge
1 18 14
2 21 19
3 24 22
4 34 25
5 44 35
6 54 45
7 65 55
然后我将数据帧传递到另一个函数中进行聚合:
grouped = df.groupby(['Year', 'Month', 'OccID', 'ageGrp', 'Sex', \
'Race', 'Hisp', 'Educ'],
as_index = False)
final = grouped.aggregate(numpy.sum)
如果我通过这种方式将年龄更改为不同的年龄组,它将非常有效:
df['ageGrp'] = 1
df.ix[(df.Age >= 14) & (df.Age <= 18), 'ageGrp'] = 1 # Age 16 - 20
df.ix[(df.Age >= 19) & (df.Age <= 21), 'ageGrp'] = 2 # Age 21 - 25
df.ix[(df.Age >= 22) & (df.Age <= 24), 'ageGrp'] = 3 # Age 26 - 44
df.ix[(df.Age >= 25) & (df.Age <= 34), 'ageGrp'] = 4 # Age 45 - 64
df.ix[(df.Age >= 35) & (df.Age <= 44), 'ageGrp'] = 5 # Age 64 - 85
df.ix[(df.Age >= 45) & (df.Age <= 54), 'ageGrp'] = 6 # Age 64 - 85
df.ix[(df.Age >= 55) & (df.Age <= 64), 'ageGrp'] = 7 # Age 64 - 85
df.ix[df.Age >= 65, 'ageGrp'] = 8 # Age 85+
df['ageGrp']=1
df.ix[(df.Age>=14)&(df.Age=19)&(df.Age=22)&(df.Age=25)&(df.Age=35)&(df.Age=45)&(df.Age=55)&(df.Age=65,'ageGrp']=8#85岁+
我更愿意在运行中执行此操作,导入定义表并使用pandas.cut
,而不是硬编码
提前谢谢你。也许这里有一个解决办法 考虑以下复制您描述的症状的示例:
import numpy as np
import pandas as pd
np.random.seed(2015)
defT = pd.DataFrame({'AgeGrp': [1, 2, 3, 4, 5, 6, 7],
'MaxAge': [18, 21, 24, 34, 44, 54, 65],
'MinAge': [14, 19, 22, 25, 35, 45, 55]})
cutoff = np.hstack([np.array(defT['MinAge'][0]), defT['MaxAge'].values])
labels = defT['AgeGrp']
N = 50
df = pd.DataFrame(np.random.randint(100, size=(N,2)), columns=['Age', 'Year'])
df['ageGrp'] = pd.cut(df['Age'], bins=cutoff, labels=labels, include_lowest=True)
grouped = df.groupby(['Year', 'ageGrp'], as_index=False)
final = grouped.agg(np.sum)
print(final)
# Year ageGrp Age
# Year ageGrp
# 3 1 NaN NaN NaN
# 2 NaN NaN NaN
# ...
# 97 1 NaN NaN NaN
# 2 NaN NaN NaN
# [294 rows x 3 columns]
如果我们改变
grouped = df.groupby(['Year', 'ageGrp'], as_index=False)
final = grouped.agg(np.sum)
到
然后我们得到:
Age
Year ageGrp
6 7 61
16 4 32
18 1 34
25 3 23
28 5 39
34 7 60
35 5 42
38 4 25
40 2 19
53 7 59
56 4 25
5 35
66 6 54
67 7 55
70 7 56
73 6 51
80 5 36
81 6 46
85 5 38
90 7 58
97 1 18
您可能需要发布一个小的数据帧来支持它。如果没有它,这只是一个猜测。添加到请求的data.frame中。@jriot您可以尝试
df['ageGrp'].isnull().sum()吗
查看输出是否为零?我怀疑age
列中有一些年龄不在bin范围内,因此pd.cut
为这些值提供NaN
,这可能会在执行groupby
时引起问题。如果您手动操作,df['ageGrp']=1
可以防止这种情况。@JianxunLi是的,因为编码年龄>=65意味着ageGrp=nan,但听起来他好像在说所有人都是nan?@JohnE分类变量中的nan
是我能想到的唯一可能导致这种奇怪行为的东西(不确定所有nan
):-)否则,pd.cut
只需给出标准的cat变量,处理groupby
应该没有问题。谢谢!这很有效。但我不知道为什么,因为我在过程的前面做了df.dropna(),但没有任何效果。
Age
Year ageGrp
6 7 61
16 4 32
18 1 34
25 3 23
28 5 39
34 7 60
35 5 42
38 4 25
40 2 19
53 7 59
56 4 25
5 35
66 6 54
67 7 55
70 7 56
73 6 51
80 5 36
81 6 46
85 5 38
90 7 58
97 1 18