我有一个带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])
答案 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