这是this question的扩展,其中OP想知道如何删除单个列中的值为NaN的行。
我想知道如何删除 2 (或更多)列中的值 NaN的行。使用第二个答案创建的数据框:
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()
命令,特别是drop.na(subset=[1,2])
,那么它会完成“或”类型的删除并离开:
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
我想要的是“和”类型下拉,它会删除列索引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
只删除第一行。
有什么想法吗?
编辑:更改数据框架值以保持一致性
答案 0 :(得分:12)
以下两项中的任何一项:
df.dropna(subset=[1, 2], how='all')
或
df.dropna(subset=[1, 2], thresh=1)
答案 1 :(得分:3)
指定dropna()
方法:
df.dropna(subset=[1,2], how='all')
答案 2 :(得分:0)
接受的答案对我不起作用。我尝试了以下代码,但数据框中没有任何变化。
yarn
编辑:我认为它不起作用,因为“全部”是指df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', inplace=True)
中的所有列,而不是df
中的所有列。
subset
也让我有些困惑,因为即使这是一个删除函数,它也是保留行的条件。在OP中,如果我理解正确,则必须至少具有一个非nan值才能保留一行,并且如果一行具有两个以上nan值,则应将其删除。
就我而言,如果thresh
列中的所有值都具有nan值,我想删除一行,因此如果所有6个值都不是nan,我想保留一行,并且我不知道这是否对应于subset
。
这两个命令对我也不起作用:
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
,也是因为我意识到某些NaN值可能不会被捕获,因为它们为Null或为空:
df
答案 3 :(得分:0)
我遇到了类似的问题,我要设置45个要素(列),并希望仅删除具有NaN值的选定要素(例如第7列至第45列)的行。
步骤1:我从要为NaN操作的列中创建了一个列表(col_lst)
第2步:df.dropna(轴= 0,子集= col_lst,how ='all',inplace = True)
上面的步骤仅从数据框中删除了具有NaN值的所有(不包括)从7到45列的所有行。