如何在Python列表中删除列表中的nan / null值?

时间:2019-12-18 10:39:33

标签: python pandas

因此,我有一个具有NaN值的数据框,并将该数据框中的所有行转换为一个列表,然后将其添加到另一个列表中。

Index   1   2   3   4   5   6   7   8   9   10  ... 71  72  73  74  75  76  77  78  79  80
orderid                                                                                 
20000765    624380  nan nan nan nan nan nan nan nan nan ... nan nan nan nan nan nan nan nan nan nan
20000766    624380  nan nan nan nan nan nan nan nan nan ... nan nan nan nan nan nan nan nan nan nan
20000768    1305984 1305985 1305983 1306021 nan nan nan nan nan nan ... nan nan nan nan nan nan nan nan nan nan
records = []
for i in range(0, 60550):
    records.append([str(dfpivot.values[i,j]) for j in range(0, 10)])

但是,很多行都包含要从列表中删除的NaN值,然后再将其放入列表中。我需要在哪里插入该代码,该怎么做?

我认为这段代码可以解决问题,但是我想它只能在“列表列表”中查找直接值:

records = [x for x in records if str(x) != 'nan']

我是Python的新手,所以我仍在弄清楚基础知识。

3 个答案:

答案 0 :(得分:3)

一种方法是利用stack删除NaNs来生成嵌套列表这一事实:

df.stack().groupby(level=0).apply(list).values.tolist()
# [[624380.0], [624380.0], [1305984.0, 1305985.0, 1305983.0, 1306021.0]]

答案 1 :(得分:1)

做到这一点的一种方法是使用嵌套列表理解:

[[j for j in i if not pd.isna(j)] for i in dfpivot.values] 

编辑 看起来像是您想要的字符串-在这种情况下,

[[str(j) for j in i if not pd.isna(j)] for i in dfpivot.values] 

答案 2 :(得分:1)

如果您想使用nans保留行,可以这样做:

In [5457]: df.T.dropna(how='all').T                                                                                                                                                            
Out[5457]: 
         Index           1           2           3           4
0 20000765.000  624380.000         nan         nan         nan
1 20000766.000  624380.000         nan         nan         nan
2 20000768.000 1305984.000 1305985.000 1305983.000 1306021.000

如果您不希望任何带有nans的列,可以这样删除它们:

In [5458]: df.T.dropna().T                                                                                                                                                                     
Out[5458]: 
         Index           1
0 20000765.000  624380.000
1 20000766.000  624380.000
2 20000768.000 1305984.000

要创建数组,请执行以下操作:

In [5464]: df.T.apply(lambda x: x.dropna().tolist()).tolist()                                                                                                                                  
Out[5464]: 
[[20000765.0, 624380.0],
 [20000766.0, 624380.0],
 [20000768.0, 1305984.0, 1305985.0, 1305983.0, 1306021.0]]

df.T[1:].apply(lambda x: x.dropna().tolist()).tolist()                                                                                                                              

Out[5471]: [[624380.0], [624380.0], [1305984.0, 1305985.0, 1305983.0, 1306021.0]]

取决于想要数组的方式