根据 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