[英]Pandas: Drop leading rows with NaN threshold in dataframe
我有一个带有间歇NaN值的Pandas Dataframe:
Index Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
1991-12-31 100.000 100.000 NaN NaN NaN NaN NaN NaN
1992-01-31 98.300 101.530 NaN NaN NaN NaN NaN NaN
1992-02-29 97.602 100.230 98.713 NaN NaN NaN NaN NaN
1992-03-31 93.473 NaN 102.060 NaN NaN NaN NaN NaN
1992-04-30 94.529 102.205 107.755 NaN NaN NaN NaN NaN
我想删除包含6个或更多NaN的行。 具体来说,在这种情况下,我只想删除带有索引“ 1991-12-31”和“ 1992-01-31”的行。
使用df.dropna(thresh = 6)不起作用,因为它也会删除行“ 1992-03-31”。
一种解决方案是对每行中的NaN进行计数,并在NaN的数量小于6时在第一行停止。
任何更快/更清洁的解决方案?
编辑:编辑为清楚和@Alexander的评论
您只需要df[(df.irow(0).isnull().sum()>5):]
当第一行具有大于5的nan
, df.irow(0).isnull().sum()>5
为True
而df[(df.irow(0).isnull().sum()>5):]
只是df[1:]
:省略了第一行。
为了解决@DSM的问题,我们可以考虑:
df.ix[np.argwhere(df.isnull().sum(1)<=5).ravel()[0]:]
基本上,这是从第一行(不是在原始df中,而是在第一行中小于或等于5 nan
)开始切片DataFrame。 这样,如果第一行有6,第二行有7,第三行有8 nan
s,则结果数据帧将从第四行开始。 如果第一行只有1 nan
,则结果将为df[0:]
,不会跳过任何行。
假设名为Index
的列实际上是索引,则可以计算每行中的空值的数量,然后选择大于阈值的空值。 如果返回任何内容,则删除第一个(即第一行)。
idx = df[df.isnull().sum(axis=1) <= 5].index
if len(idx) > 0:
df = df.ix[idx[0]:]
>>> df
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8
Index
1992-02-29 97.602 100.230 98.713 NaN NaN NaN NaN NaN
1992-03-31 93.473 NaN 102.060 NaN NaN NaN NaN NaN
1992-04-30 94.529 102.205 107.755 NaN NaN NaN NaN NaN
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.