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
您会看到解决方案按照您想要的方式工作。
我有一个名为 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
您会看到解决方案按照您想要的方式工作。