1

所以我有这个大数据框,里面有很多列,比如年龄、姓名、性别等。

我想创建一个年龄组在 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。有人可以帮我解决这个问题吗?

4

1 回答 1

1

我认为首先有必要通过@samthegolden 的评论来解释:

(10, 20] 表示“10 到 20 之间,不包括 10,包括 20”,因为括号格式。

但是您可以通过列表理解中的withlabels创建的参数来做到这一点:rangeszip

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
于 2020-03-03T14:24:57.137 回答