如果两个变量都为 NULL,则有条件地删除行



来自Python newb的简单问题。

我有一个包含 15+ 变量和数千条记录的数据帧。当"DOCTORSEE_DATE_TIME"变量和"PT_ACUITY"变量均为"Null"时,我想从此数据框中删除记录。

我有代码可以在DOCTORSEE_DATE_TIME或PT_ACUITY为 NULL 时删除记录,但我需要"要么"是"AND"。

TAT_v3 = TAT_v2.dropna(subset=['DOCTORSEE_DATE_TIME','PT_ACUITY'],how='all')

我尝试了这行代码,但得到并出错:

法典

TAT_v3 = TAT_v2.dropna((subset=['DOCTORSEE_DATE_TIME','PT_ACUITY'],how='all') & (subset=['PT_ACUITY'],how='all'))

错误

File "<ipython-input-14-6b23c103c833>", line 2
TAT_v3 = TAT_v2.dropna((subset=['DOCTORSEE_DATE_TIME','PT_ACUITY'],how='all') & (subset=['PT_ACUITY'],how='all'))
^
SyntaxError: invalid syntax

您可以将df.isnull()all()一起使用,如下所示:

df = pd.DataFrame({
'DOCTORSEE_DATE_TIME': [1, np.nan, np.nan],
'PT_ACUITY': [2, 3, np.nan],
'SOME_OTHER_COL': [np.nan, 4, 5]
})
cols = ['DOCTORSEE_DATE_TIME', 'PT_ACUITY']  # choose columns that must all be null
results = df[~df[cols].isnull().all(axis=1)]

结果:

DOCTORSEE_DATE_TIME  PT_ACUITY  SOME_OTHER_COL
0                  1.0        2.0             NaN
1                  NaN        3.0             4.0

为什么这样做:

df[cols].isnull()为每个单元格提供一个TrueFalse值:

DOCTORSEE_DATE_TIME  PT_ACUITY
0                False      False
1                 True      False
2                 True       True

.all(axis=1)链接到此将结果减少到每行的单个TrueFalse值(axis=0将按列而不是按行检查(:

0    False
1    False
2     True

~运算符用于取结果的反函数:

0     True
1     True
2    False

然后,这一系列TrueTrueFalse用于切片我们的原始数据帧,因此只保留前两行。

最新更新