所以我有一个大数据框架,里面有很多列,比如年龄、姓名、性别等。
我想做一个新的专栏,年龄段在1-10,11-20,21-30,。。。,71-80
我试着做
ranges = [1, 10, 20, 30, 40, 50, 60, 70, 80]
df.age.groupby(pd.cut(df.age, ranges)).count()
结果是
age
(1, 10] 64
(10, 20] 162
(20, 30] 361
(30, 40] 210
(40, 50] 132
(50, 60] 62
(60, 70] 27
(70, 80] 6
Name: age, dtype: int64
这正是我想要的,但是分组不正确。我希望是1-10,然后是11-20,而不是1-10和10-20。有人能帮我解决这个问题吗?
我认为首先有必要通过@samthegolden:的评论进行解释
(10,20](由于括号格式的原因,意思是"介于10和20之间,不包括10和20"。
但您可以通过列表理解中ranges
和zip
创建的labels
参数来实现:
np.random.seed(2020)
df = pd.DataFrame({'age':np.random.randint(1, 80, size=100)})
ranges = [1, 10, 20, 30, 40, 50, 60, 70, 80]
labels = ['{}-{}'.format(i + 1, j) for i, j in zip(ranges[:-1], ranges[1:])]
labels[0] = '{}-{}'.format(ranges[0], ranges[1])
print (labels)
['1-10', '11-20', '21-30', '31-40', '41-50', '51-60', '61-70', '71-80']
ranges = [1, 10, 20, 30, 40, 50, 60, 70, 80]
s = df.age.groupby(pd.cut(df.age, ranges, labels=labels)).count()
print (s)
age
1-10 14
11-20 10
21-30 15
31-40 12
41-50 7
51-60 11
61-70 18
71-80 12
Name: age, dtype: int64