Python-如果两列为NaN,则删除行
这是对的扩展,OP想知道如何删除单个列中的值为NaN的行 我想知道如何删除2(或更多)列中的值都的行。使用第二个答案创建的数据框:Python-如果两列为NaN,则删除行,python,pandas,dataframe,Python,Pandas,Dataframe,这是对的扩展,OP想知道如何删除单个列中的值为NaN的行 我想知道如何删除2(或更多)列中的值都的行。使用第二个答案创建的数据框: In [1]: df = pd.DataFrame(np.random.randn(10,3)) In [2]: df.ix[::2,0] = np.nan; df.ix[::4,1] = np.nan; df.ix[::3,2] = np.nan; In [3]: df Out[3]: 0 1 2 0
In [1]: df = pd.DataFrame(np.random.randn(10,3))
In [2]: df.ix[::2,0] = np.nan; df.ix[::4,1] = np.nan; df.ix[::3,2] = np.nan;
In [3]: df
Out[3]:
0 1 2
0 NaN NaN NaN
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
3 0.672201 0.964789 NaN
4 NaN NaN 0.050742
5 -1.250970 0.030561 -2.678622
6 NaN 1.036043 NaN
7 0.049896 -0.308003 0.823295
8 NaN NaN 0.637482
9 -0.310130 0.078891 NaN
如果我使用drop.na()
In[4]: df.dropna(subset=[1,2])
Out[4]:
0 1 2
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
5 -1.250970 0.030561 -2.678622
7 0.049896 -0.308003 0.823295
我想要的是一个“and”类型的drop,它在索引1和索引2的列中有NaN
的地方删除行。这将留下:
0 1 2
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
3 0.672201 0.964789 NaN
4 NaN NaN 0.050742
5 -1.250970 0.030561 -2.678622
6 NaN 1.036043 NaN
7 0.049896 -0.308003 0.823295
8 NaN NaN 0.637482
9 -0.310130 0.078891 NaN
其中仅删除第一行
有什么想法吗
编辑:更改一致性的数据帧值以下两个选项之一:
df.dropna(subset=[1, 2], how='all')
或
指定方法:
被接受的答案对我不起作用。我尝试了下面的代码,但在我的数据帧中没有任何更改
df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', inplace=True)
EDIT:我认为它不起作用,因为“all”指的是df
中的所有列,而不是子集中的所有列。
thresh
对我来说也有点混乱,因为它是保留行的条件,即使这是一个删除函数。在OP中,如果我理解正确,则要求至少有一个非nan值来保留一行,如果一行有两个以上的nan值,则应将其删除。
在我的例子中,如果子集的列中的所有值都是nan值,我想删除一行,因此如果所有6个值都不是nan值,我想保留一行,我不知道这是否对应于thresh=6
这两个命令对我也不起作用:
df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], thres=6, inplace=True)
df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', thres=6, inplace=True)
当我在参数中添加axis=1
或axis='columns'
时,我得到了一个KeyError
,我要传递的列列表不在数据帧中,我不知道原因
我最终像这样迭代了df
,这也是因为我意识到一些假定的NaN值可能不会被捕获,因为它们是Null或空的:
indices_to_drop = list()
for index, row in df.iterrows():
if (pd.isnull(row["col1"]) or pd.isna(row["col1"]) or row["col1"] == "") and \
(pd.isnull(row["col2"]) or pd.isna(row["col2"]) or row["col2"] == "") and \
(pd.isnull(row["col3"]) or pd.isna(row["col3"]) or row["col3"]
== "") and \
(pd.isnull(row["col4"]) or pd.isna(row["col4"]) or row["col4"] ==
"") \
and \
(pd.isnull(row["col5"]) or pd.isna(row["col5"]) or row[
"col6"] == "") and \
(pd.isnull(row["col6"]) or pd.isna(row["col6"]) or row["col6"] == ""):
indices_to_drop.append(index)
df.drop(labels=indices_to_drop, inplace=True)
我遇到了一个类似的问题,我选择了45个特性(列),只想删除具有NaN
值的选定特性的行,例如第7列到第45列
步骤1:我创建了一个列表(col_lst
),它来自我想要为NaN
第二步:df.dropna(axis=0,subset=col\u lst,how='all',inplace=True)
上面的步骤只从数据帧中删除了那些行,这些行包含从7到45的所有列(不是任何列),这些列的值都是NaN
值。现在我觉得自己像个白痴,应该学会了……谢谢!如果我只想删除NAN行,如果两个(或更多)连续行具有NAN值,它是如何工作的?但是,必须保留带有NAN的单行(上面和下面的行没有NAN)。@zeniapy我认为您必须使用df.iterrows()
在数据帧上迭代,并且对于具有一些NAN值的每一行,检查前后两个条目,如果这些条目也有nan值,则删除当前行。共享一些代码以进行演示,而不是枯燥的单词如何?
df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], thres=6, inplace=True)
df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', thres=6, inplace=True)
indices_to_drop = list()
for index, row in df.iterrows():
if (pd.isnull(row["col1"]) or pd.isna(row["col1"]) or row["col1"] == "") and \
(pd.isnull(row["col2"]) or pd.isna(row["col2"]) or row["col2"] == "") and \
(pd.isnull(row["col3"]) or pd.isna(row["col3"]) or row["col3"]
== "") and \
(pd.isnull(row["col4"]) or pd.isna(row["col4"]) or row["col4"] ==
"") \
and \
(pd.isnull(row["col5"]) or pd.isna(row["col5"]) or row[
"col6"] == "") and \
(pd.isnull(row["col6"]) or pd.isna(row["col6"]) or row["col6"] == ""):
indices_to_drop.append(index)
df.drop(labels=indices_to_drop, inplace=True)