繁体   English   中英

熊猫:在数据帧中删除具有NaN阈值的前导行

[英]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的nandf.irow(0).isnull().sum()>5Truedf[(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM