因此,我有一个具有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的新手,所以我仍在弄清楚基础知识。
答案 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]]
取决于想要数组的方式