如何从列中删除NaN

时间:2018-02-21 18:02:58

标签: python pandas numpy dataframe

我有一个带NaN的数据框。我必须仅在起始行删除nan,并且希望在实数开始后保持NaN:

假设:我的数据框是这样的:

a = pd.DataFrame({'data':[np.nan,np.nan,np.nan,np.nan,4,5,6,2,np.nan,1,3,4,5,np.nan,4,5,np.nan,np.nan]})

a= 
    data
    0   NaN
    1   NaN
    2   NaN
    3   NaN
    4   4.0
    5   5.0
    6   6.0
    7   2.0
    8   NaN
    9   1.0
    10  3.0
    11  4.0
    12  5.0
    13  NaN
    14  4.0
    15  5.0
    16  NaN
    17  NaN

我尝试在开头删除NaN,并希望数据框如下:

        data
    4   4.0
    5   5.0
    6   6.0
    7   2.0
    8   NaN
    9   1.0
    10  3.0
    11  4.0
    12  5.0
    13  NaN
    14  4.0
    15  5.0
    16  NaN
    17  NaN

我尝试使用此功能但无法正常工作。任何帮助将受到高度赞赏。

for w in np.arange(len(a)):
    if a.iloc[w] == np.nan:
        a.drop(a.index[w])

4 个答案:

答案 0 :(得分:4)

获取第一个有效索引和切片

idx = a.first_valid_index()
a.loc[idx:]

    data
4   4.0
5   5.0
6   6.0
7   2.0
8   NaN
9   1.0
10  3.0
11  4.0
12  5.0
13  NaN
14  4.0
15  5.0
16  NaN
17  NaN

答案 1 :(得分:3)

尝试这样的事情:

start = a[a.data.notnull()].index[0]
new_df = a.loc[start:]

第一行找到第一个非空值的索引,第二行从数据帧中删除之前的所有条目。

答案 2 :(得分:2)

而不是删除"坏"行,你可以找到并保存好的"行:

b = a[a.data.fillna(method='ffill').notnull()]
#     data
#4    4.0
#5    5.0
#6    6.0
#7    2.0
#8    NaN
#9    1.0

答案 3 :(得分:1)

嗯,你应该使用first_valid_index(),但这是另一种方式: - )

a.loc[a.data.notnull().nonzero()[0][0]:]
Out[1276]: 
    data
4    4.0
5    5.0
6    6.0
7    2.0
8    NaN
9    1.0
10   3.0
11   4.0
12   5.0
13   NaN
14   4.0
15   5.0
16   NaN
17   NaN