制作列类别并将其添加到新列
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');
输出:
我有这样的数据,我想根据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');
输出: