生成没有NaN值的新DataFrame

时间:2018-08-31 10:32:30

标签: python pandas dataframe

我有以下数据框:

     a    b    c    d    e
0  NaN  2.0  NaN  4.0  5.0
1  NaN  2.0  3.0  NaN  5.0
2  1.0  NaN  3.0  4.0  NaN
3  1.0  2.0  NaN  4.0  NaN
4  NaN  2.0  NaN  4.0  5.0

我要尝试的是生成一个没有NaN值的新数据框。 连续存在相同数量的NaN值。

最终的数据框应如下所示:

   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5

有人知道这样做的简单方法吗? 任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

使用数组索引:

pd.DataFrame(df.values[df.notnull().values].reshape(df.shape[0],3),
             columns=list('xyz'),dtype=int)

    x   y   z
0   2   4   5
1   2   3   5
2   1   3   4
3   1   2   4
4   2   4   5

如果dataframe在第1行有4个值的行中有更多不一致的值,而从第2行起有3个值,则这样做:

    a   b   c   d   e   g
0   NaN 2.0 NaN 4.0 5.0 6.0
1   NaN 2.0 3.0 NaN 5.0 NaN
2   1.0 NaN 3.0 4.0 NaN NaN
3   1.0 2.0 NaN 4.0 NaN NaN
4   NaN 2.0 NaN 4.0 5.0 NaN

pd.DataFrame(df.apply(lambda x: x.values[x.notnull()],axis=1).tolist())

    0   1   2   3
0   2.0 4.0 5.0 6.0
1   2.0 3.0 5.0 NaN
2   1.0 3.0 4.0 NaN
3   1.0 2.0 4.0 NaN
4   2.0 4.0 5.0 NaN

在这里我们无法删除最后一列中的NaN's

答案 1 :(得分:1)

使用justify功能并选择前三列:

df = pd.DataFrame(justify(df.values,invalid_val=np.nan)[:, :3].astype(int),
                  columns=list('xyz'), 
                  index=df.index)
print (df)
   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5

答案 2 :(得分:0)

如果在您的示例中,值在各列中增加,则可以对axis=1进行排序:

res = pd.DataFrame(np.sort(df.values, 1)[:, :3],
                   columns=list('xyz'), dtype=int)

print(res)

   x  y  z
0  2  4  5
1  2  3  5
2  1  3  4
3  1  2  4
4  2  4  5