Python .drop 没有给出我期望的结果

Python .drop does not give the result I expect

我有一个名为 xxx 的数据框。 xxx 的一列是最终的,xxx 看起来像这样

  FpPropeTypCode DTE_DATE_DEATH             Area         Final  
0             FP            NaN  Ame_MidEast_Lnd           NaN  
1             FP            NaN  Southern_Europe  W.E.M. Lines  
2             FP            NaN              NaN           NaN  
3             ZP            NaN  Ame_MidEast_Lnd           NaN  
4             YY            NaN  Ame_MidEast_Lnd           NaN  

我想删除所有 Final 为 NaN 的行,所以我所做的是

xxx= xxx.drop(pd.isnull(data_file_fp4['Final']))

不幸的是我得到的是

  FpPropeTypCode DTE_DATE_DEATH             Area                         Final  
2             FP            NaN              NaN                           NaN  
3             ZP            NaN  Ame_MidEast_Lnd                           NaN  
4             YY            NaN  Ame_MidEast_Lnd                           NaN  
5             NN            NaN  Ame_MidEast_Lnd  NORTH ARM TRANSPORTATION LTD  
6             CP            NaN  Northern_Europe                     MPC Group 

这显然不对...

我实际需要做的是根据两个条件删除行:Final 为 NaN,Area 为 Ame_MidEast_Lnd。所以我不能真正使用 dropna

我当前的代码只是执行第一个条件有什么问题?提前致谢。

您在使用 pandas 吗? Pandas 具有允许您根据条件删除行的功能,在本例中,某列为 NaN: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html

您要查找的特定命令可能类似于:

xxx = xxx.dropna(axis=0, subset=['Final'])

axis=0 指定要删除行而不是列 subset 指定要删除 'Final' 为 NaN

的位置

编辑:提问者不能使用 dropna,因为他们的过滤器逻辑更复杂。

如果你想要更复杂的逻辑,你最好只做括号逻辑。我稍后会尝试验证,但你能试试这样吗:

xxx = xxx[~xxx['Final'].isnull()]

如果您想要逻辑的第二部分,即您同时拥有 NaN 筛选器和列筛选器,您可以这样做:

xxx = xxx[~(xxx['Final'].isnull() & xxx['Area'].str.contains("Ame_MidEast_Lnd"))]

我已经通过下面的 运行 这个 python 文件验证了它的工作原理:

import pandas as pd
import numpy as np

xxx = pd.DataFrame([
                    ['FP', np.nan, 'Ame_MidEast_Lnd', np.nan],
                    ['FP', np.nan, 'Southern_Europe', 'W.E.M. Lines'],
                    ['FP', np.nan, np.nan, np.nan],
                    ['ZP', np.nan, 'Ame_MidEast_Lnd', np.nan],
                    ['YY', np.nan, 'Ame_MidEast_Lnd', np.nan]],
                   columns=['FpPropeTypCode','DTE_DATE_DEATH','Area', 'Final']
                   )

# before
print xxx

# whatever rows have both 'Final' as NaN and 'Area' containing Ame_MidEast_Lnd, we do NOT want those rows
xxx = xxx[~(xxx['Final'].isnull() & xxx['Area'].str.contains("Ame_MidEast_Lnd"))]

# after
print xxx

您会看到解决方案按照您想要的方式工作。