根据 python 数据框中的其他列计算列数
Calculate count of a column based on other column in python dataframe
我有一个数据框,如下所示,ICULOS 显示患者在 ICU 中停留(以小时为单位)。
df # Main dataframe
dfy = df.copy()
dfy
P_ID
ICULOS
Count
1
1
5
1
2
5
1
3
5
1
4
5
1
5
5
2
1
9
2
2
9
2
3
9
2
4
9
2
5
9
2
6
9
2
7
9
2
8
9
2
9
9
3
1
3
3
2
3
3
3
3
4
1
7
4
2
7
4
3
7
4
4
7
4
5
7
4
6
7
4
7
7
我计算了他们的 ICULOS 计数并使用以下代码将其放入名为 Count 的新列中:
dfy['Count'] = dfy.groupby(['P_ID'])['ICULOS'].transform('count')
现在,我想根据 P_ID 删除那些计数小于 8 的患者。(注意,我想删除整个患者记录)。因此,在移除 Count < 8 的患者后,只有 P_ID = 2 会保留,因为计数为 9.
期望的输出:
P_ID
ICULOS
Count
2
1
9
2
2
9
2
3
9
2
4
9
2
5
9
2
6
9
2
7
9
2
8
9
2
9
9
我尝试了以下代码,但出于某种原因,它对我不起作用。它确实对我有用,但是当我几天后重新 运行 代码时,它给了我 0 结果 。有人可以建议更好的代码吗?谢谢。
dfy = dfy.drop_duplicates(subset=['P_ID'],keep='first')
lis1 = dfy['P_ID'].tolist()
Icu_less_8 = dfy.loc[dfy['Count'] < 8]
lis2 = Icu_less_8.P_ID.to_list()
lis_3 = [k for k in tqdm_notebook(lis1) if k not in lis2]
# removing those patients who have ICULOS of less than 8 hours
df_1 = pd.DataFrame()
for l in tqdm_notebook(lis_3, desc = 'Progress'):
df_1 = df_1.append(df.loc[df['P_ID']==l])
您可以使用 Series.ge
:
直接过滤转换中的行
In [1521]: dfy[dfy.groupby(['P_ID'])['ICULOS'].transform('count').ge(8)]
Out[1521]:
P_ID ICULOS Count
5 2 1 9
6 2 2 9
7 2 3 9
8 2 4 9
9 2 5 9
10 2 6 9
11 2 7 9
12 2 8 9
13 2 9 9
在 OP 评论后编辑: 对于多个条件,执行:
In [1533]: x = dfy.groupby(['P_ID'])['ICULOS'].transform('count')
In [1539]: dfy.loc[x[x.ge(8) & x.le(72)].index]
Out[1539]:
P_ID ICULOS Count
5 2 1 9
6 2 2 9
7 2 3 9
8 2 4 9
9 2 5 9
10 2 6 9
11 2 7 9
12 2 8 9
13 2 9 9
我有一个数据框,如下所示,ICULOS 显示患者在 ICU 中停留(以小时为单位)。
df # Main dataframe
dfy = df.copy()
dfy
P_ID | ICULOS | Count |
---|---|---|
1 | 1 | 5 |
1 | 2 | 5 |
1 | 3 | 5 |
1 | 4 | 5 |
1 | 5 | 5 |
2 | 1 | 9 |
2 | 2 | 9 |
2 | 3 | 9 |
2 | 4 | 9 |
2 | 5 | 9 |
2 | 6 | 9 |
2 | 7 | 9 |
2 | 8 | 9 |
2 | 9 | 9 |
3 | 1 | 3 |
3 | 2 | 3 |
3 | 3 | 3 |
4 | 1 | 7 |
4 | 2 | 7 |
4 | 3 | 7 |
4 | 4 | 7 |
4 | 5 | 7 |
4 | 6 | 7 |
4 | 7 | 7 |
我计算了他们的 ICULOS 计数并使用以下代码将其放入名为 Count 的新列中:
dfy['Count'] = dfy.groupby(['P_ID'])['ICULOS'].transform('count')
现在,我想根据 P_ID 删除那些计数小于 8 的患者。(注意,我想删除整个患者记录)。因此,在移除 Count < 8 的患者后,只有 P_ID = 2 会保留,因为计数为 9.
期望的输出:
P_ID | ICULOS | Count |
---|---|---|
2 | 1 | 9 |
2 | 2 | 9 |
2 | 3 | 9 |
2 | 4 | 9 |
2 | 5 | 9 |
2 | 6 | 9 |
2 | 7 | 9 |
2 | 8 | 9 |
2 | 9 | 9 |
我尝试了以下代码,但出于某种原因,它对我不起作用。它确实对我有用,但是当我几天后重新 运行 代码时,它给了我 0 结果 。有人可以建议更好的代码吗?谢谢。
dfy = dfy.drop_duplicates(subset=['P_ID'],keep='first')
lis1 = dfy['P_ID'].tolist()
Icu_less_8 = dfy.loc[dfy['Count'] < 8]
lis2 = Icu_less_8.P_ID.to_list()
lis_3 = [k for k in tqdm_notebook(lis1) if k not in lis2]
# removing those patients who have ICULOS of less than 8 hours
df_1 = pd.DataFrame()
for l in tqdm_notebook(lis_3, desc = 'Progress'):
df_1 = df_1.append(df.loc[df['P_ID']==l])
您可以使用 Series.ge
:
In [1521]: dfy[dfy.groupby(['P_ID'])['ICULOS'].transform('count').ge(8)]
Out[1521]:
P_ID ICULOS Count
5 2 1 9
6 2 2 9
7 2 3 9
8 2 4 9
9 2 5 9
10 2 6 9
11 2 7 9
12 2 8 9
13 2 9 9
在 OP 评论后编辑: 对于多个条件,执行:
In [1533]: x = dfy.groupby(['P_ID'])['ICULOS'].transform('count')
In [1539]: dfy.loc[x[x.ge(8) & x.le(72)].index]
Out[1539]:
P_ID ICULOS Count
5 2 1 9
6 2 2 9
7 2 3 9
8 2 4 9
9 2 5 9
10 2 6 9
11 2 7 9
12 2 8 9
13 2 9 9