制作列类别并将其添加到新列

Make column category and add it to new column

我有这样的数据,我想根据P_ID列制作年龄类别并将其存储在一个新列 AgeCatg。我关注了 但遇到了一些问题。

Age P_ID
51 1
51 1
51 1
28 2
28 2
28 2
28 2
35 3
35 3
35 3
35 3
89 4
89 4
89 4
89 4
14 5
14 5
38 6
38 6
38 6

需要输出如下:

Age P_ID AgeCatg
51 1 50-60
51 1 50-60
28 2 20-30
28 2 20-30
28 2 20-30
28 2 20-30
35 3 30-40
35 3 30-40
35 3 30-40
35 3 30-40
89 4 80-90
89 4 80-90
89 4 80-90
89 4 80-90
14 5 10-20
14 5 10-20
38 6 30-40
38 6 30-40
38 6 30-40

我尝试了以下代码,然后绘制了图表,但出现问题。

print(f'The minimum age is {v.Age.min()} and maximum age is {v.Age.max()}.')
# Output
The minimum age is 14 and maximum age is 89.
v['AgeCatg'] = pd.cut(v['Age'], np.arange(9, 90, 10), labels=[f'{x}-{x + 10}' for x in np.arange(10, 89, 10)])
v['AgeCatg'].value_counts().sort_index()

# Output
10-20    2
20-30    4
30-40    7
40-50    0
50-60    3
60-70    0
70-80    0
80-90    4

# Graph
plt.figure(figsize=(10,6));
ax = sns.countplot(data=v, x='AgeCatg', palette="tab10")
ax.set_title("Patient count Age category wise", y = 1)
ax.set_ylabel('Total Count')
ax.set_xlabel('Age Categories')
for rect in ax.patches:
    y_value = rect.get_height()
    x_value = rect.get_x() + rect.get_width() / 2
    space = 1
    label = "{:.0f}".format(y_value)
    ax.annotate(label, (x_value, y_value), xytext=(0, space), textcoords="offset points", ha='center', va='bottom') 

此处,代码绘制属于该类别的总行数,但我想绘制患者计数,而不是患者行。比如,P_ID 3 和 6 位于 AgeCatg 30-40,所以 图应该绘制 2 在栏上方,而不是 7 的总行数。我认为问题出在我使用 pd.cut() 的地方。我尝试了以下但它给出了错误的结果。

x['AgeCatg'] = pd.cut(x.groupby('P_ID')['Age'].first(), np.arange(9, 90, 10), labels=[f'{x}-{x + 10}' for x in np.arange(10, 89, 10)])

请帮忙。谢谢。

更新

P 之后。 Pinho 回答,我在我的真实数据上应用了代码。它工作得很好。但是,图形的 x 轴标签存在一个小问题。请看一下,让我知道它是如何变成 10-20、20-30、30-40 ... 而不是 10-20、100-110、20-30 ... 谢谢

试试这个:

df = pd.DataFrame({'Age' :[51,51,51,28,28,28,28,35,35,35,35,89,89,89,89,14,14,38,38,38],
                   'P_ID':[1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,6,6,6]})

EDIT 1:为了创建 AgeCatg 列,我创建了一个由 fstring 填充的列表。 // 运算符 returns 楼层划分。例如:51//10 = 5,如果我们乘以10,我们得到我们要找的小数。如果我们加上 10,我们就有适当的时间 window.

df['AgeCatg'] = [f'{i//10*10}-{i//10*10+10}' for i in df['Age']]

输出:

df

   Age  P_ID  AgeCatg
 0  51     1    50-60
 1  51     1    50-60
 2  51     1    50-60
 3  28     2    20-30
 4  28     2    20-30
 5  28     2    20-30
 6  28     2    20-30
 7  35     3    30-40
 8  35     3    30-40
 9  35     3    30-40
10  35     3    30-40
11  89     4    80-90
12  89     4    80-90
13  89     4    80-90
14  89     4    80-90
15  14     5    10-20
16  14     5    10-20
17  38     6    30-40
18  38     6    30-40
19  38     6    30-40

图表:

df.groupby('AgeCatg').agg({'P_ID': 'nunique'}).plot(kind='bar', figsize=(10,6), title='Patient count Age category wise');

输出: