Python 如何删除'row[patient_id]'重复且'row[Target]==0'的行?

Python 如何删除'row[patient_id]'重复且'row[Target]==0'的行?,python,csv,dataframe,Python,Csv,Dataframe,我想从.csv文件中删除所有行,其中: 1) 行[患者id]重复 2) 行[目标]==0 COL的名称: patientId x y w h目标 patientId x y w h Target '2341-vcb1' '10' '20' '30' '40' '1' '2341-vcb1' '70' '20' '70' '40' '1' '2341-vcb1'

我想从.csv文件中删除所有行,其中:

1)
行[患者id]
重复

2)
行[目标]==0

COL的名称:
patientId x y w h目标

patientId        x      y     w       h      Target
'2341-vcb1'    '10'   '20'   '30'   '40'      '1'
'2341-vcb1'    '70'   '20'   '70'   '40'      '1'
'2341-vcb1'                                   '0'   <-delete it
'1111-xcsc'                                   '0'
'2341-v233'    '34'   '43'   '10'   '29'      '1'
patientId x y w h目标
'2341-vcb1''10''20''30''40''1'
'2341-vcb1''70''20''70''40''1'

“2341-vcb1”“0”您可以做的一件事是创建一个列,在其中计算目标的累积和。首先按patientId对df进行排序,然后按降序对目标进行排序,然后使用groupby和cumsum函数将目标相加(称为target\u sum)。拥有该列后,可以删除target=0且target_sum>0的行

背后的逻辑是:

  • 如果id在target==0的行上方有其他有效行(因为我们已经对它进行了排序),target\u sum应该大于0。因此,如果我们看到target_sum>0,我们就知道此行有一个重复的id
  • 如果target_sum=0,则表示特定id没有任何其他具有有效值的行,因此我们希望保留它

你可以试试

import numpy as np

df[~np.logical_and(df.patientId.duplicated(), df.Target==0)]

# patientId     x     y     w     h  Target
# 0  2341-vcb1  10.0  20.0  30.0  40.0       1                
# 1  2341-vcb1  70.0  20.0  70.0  40.0       1                
# 3  1111-xcsc   NaN   NaN   NaN   NaN       0             
# 4  2341-v233  34.0  43.0  10.0  29.0       1     

你能提供一些示例输入吗?可能是CSV中的几行。还要发布您尝试过的代码,即使它不起作用。这有助于我们更快地帮助你。我添加了一个图像。请不要显示代码或数据的图像。将其格式化为代码,即缩进4个字符。Ok。一分钟.TypeError:sort_values()得到一个意外的关键字参数'descending',我将其更改为:
ascending=False
,但我得到另一个错误:
ValueError:level name patientId不是索引的名称
你是对的。它应该是升序=False。我的错。让我来解决它。请尝试groupby('patientID'),不带级别。(如果它有多个索引并且patientID是您的索引之一,则使用级别)。
19 010ccb9f-6d46-4380-af11-84f87397a1b8 NaN NaN 0
20 010ccb9f-6d46-4380-af11-84f87397a1b8 301.0 405.0 141.0 279.0 1
可能df.目标是字符串?我不知道您的前三条评论是什么意思,但是您可以通过
print(df.dtypes)
import numpy as np

df[~np.logical_and(df.patientId.duplicated(), df.Target==0)]

# patientId     x     y     w     h  Target
# 0  2341-vcb1  10.0  20.0  30.0  40.0       1                
# 1  2341-vcb1  70.0  20.0  70.0  40.0       1                
# 3  1111-xcsc   NaN   NaN   NaN   NaN       0             
# 4  2341-v233  34.0  43.0  10.0  29.0       1