从每个列中删除NaN,并使用python/numpy重新排列它

从每个列中删除NaN,并使用python/numpy重新排列它,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我的上一个问题也有类似的问题: 但在这种情况下,我需要删除NaN。我尝试了许多解决方案,包括修改我上一篇文章中的解决方案: a = a[a!=np.nan].reshape(-1,3) 但它给了我奇怪的结果。 以下是我在Dataframe中的初始矩阵: A B C D E F nan nan nan 0.0 27.7 nan nan nan nan 5.0 27.5 nan nan nan nan 10.0 27.4 nan 0.0 29.8 nan nan na

我的上一个问题也有类似的问题:

但在这种情况下,我需要删除NaN。我尝试了许多解决方案,包括修改我上一篇文章中的解决方案:

a = a[a!=np.nan].reshape(-1,3)
但它给了我奇怪的结果。 以下是我在Dataframe中的初始矩阵:

 A   B   C   D    E   F
nan nan nan 0.0  27.7 nan
nan nan nan 5.0  27.5 nan
nan nan nan 10.0 27.4 nan
0.0  29.8 nan nan nan nan
5.0  29.9 nan nan nan nan
10.0 30.0 nan nan nan nan
nan nan 0.0  28.6 nan nan 
nan nan 5.0  28.6 nan nan 
nan nan 10.0 28.5 nan nan 
nan nan 15.0 28.4 nan nan 
nan nan 20.0 28.3 nan nan 
nan nan 25.0 28.2 nan nan
我希望得到这样的结果:

 A    B
0.0  27.7
5.0  27.5
10.0 27.4
0.0  29.8 
5.0  29.9 
10.0 30.0 
0.0  28.6 
5.0  28.6
10.0 28.5 
15.0 28.4 
0.0  28.3 
25.0 28.2
如果每行始终有2个非缺失值,则使用~for invert mask测试缺失值:

a = df.to_numpy()
df = pd.DataFrame(a[~np.isnan(a)].reshape(-1,2))
print (df)
       0     1
0    0.0  27.7
1    5.0  27.5
2   10.0  27.4
3    0.0  29.8
4    5.0  29.9
5   10.0  30.0
6    0.0  28.6
7    5.0  28.6
8   10.0  28.5
9   15.0  28.4
10  20.0  28.3
11  25.0  28.2
另一个想法是将FUNCTION用于仅删除NAN列:

df1 = (pd.DataFrame(justify(a, invalid_val=np.nan),
                    columns=df.columns).dropna(how='all', axis=1))
print (df1)
       A     B
0    0.0  27.7
1    5.0  27.5
2   10.0  27.4
3    0.0  29.8
4    5.0  29.9
5   10.0  30.0
6    0.0  28.6
7    5.0  28.6
8   10.0  28.5
9   15.0  28.4
10  20.0  28.3
11  25.0  28.2
编辑:

如果每行始终有2个非缺失值,则使用~for invert mask测试缺失值:

a = df.to_numpy()
df = pd.DataFrame(a[~np.isnan(a)].reshape(-1,2))
print (df)
       0     1
0    0.0  27.7
1    5.0  27.5
2   10.0  27.4
3    0.0  29.8
4    5.0  29.9
5   10.0  30.0
6    0.0  28.6
7    5.0  28.6
8   10.0  28.5
9   15.0  28.4
10  20.0  28.3
11  25.0  28.2
另一个想法是将FUNCTION用于仅删除NAN列:

df1 = (pd.DataFrame(justify(a, invalid_val=np.nan),
                    columns=df.columns).dropna(how='all', axis=1))
print (df1)
       A     B
0    0.0  27.7
1    5.0  27.5
2   10.0  27.4
3    0.0  29.8
4    5.0  29.9
5   10.0  30.0
6    0.0  28.6
7    5.0  28.6
8   10.0  28.5
9   15.0  28.4
10  20.0  28.3
11  25.0  28.2
编辑:

解决方案: 给定输入数据帧a:

这将为您提供所需的输出

例子: 解决方案: 给定输入数据帧a:

这将为您提供所需的输出

例子:

numpy中的NaN永远不会等于NaN。你必须让isnan来做这件事。对前面的答案进行调整是很直接的,这一改变是的,你是对的。。我没有注意到isnan会适应不同的问题。我的坏习惯是不注意它。谢谢,反正那不是数字。如果有两个变量不是一个数字,比如说它们分别是a和B,那么它们可能不一定彼此相等。想想看,努比的一个楠永远不会等于楠。你必须让isnan来做这件事。对前面的答案进行调整是很直接的,这一改变是的,你是对的。。我没有注意到isnan会适应不同的问题。我的坏习惯是不注意它。谢谢,反正那不是数字。如果有两个变量不是一个数字,比如说它们分别是a和B,那么它们可能不一定彼此相等。想一想,非常感谢!它工作得很好!这给了我更多使用熊猫的视角/numpy@diyon-性能不重要?对我来说,只要它能解决我的问题,我不介意使用它。。只是需要更多的练习来解决这种问题problem@diyon-不理解,所以性能不重要?添加了一些时间,以便在小数据框11k行中回答。在这里应用是错误的决定。@diyon-ya,这取决于您。我建议不要使用apply,但如果数据很小或性能不好,请不要介意。祝你好运非常感谢你!它工作得很好!这给了我更多使用熊猫的视角/numpy@diyon-性能不重要?对我来说,只要它能解决我的问题,我不介意使用它。。只是需要更多的练习来解决这种问题problem@diyon-不理解,所以性能不重要?添加了一些时间,以便在小数据框11k行中回答。在这里应用是错误的决定。@diyon-ya,这取决于您。我建议不要使用apply,但如果数据很小或性能不好,请不要介意。祝你好运非常感谢。所以它基本上会自动从最近的单元格填充NaN,对吗?是的。出于文档目的,请接受对您帮助最大的答案。好的,我明白了。。。嗯,但是第五行被删除了?如果存在向量化,那么性能很重要,请不要使用应用解决方案,因为应用是引擎盖下的循环。谢谢!所以它基本上会自动从最近的单元格填充NaN,对吗?是的。出于文档目的,请接受对您帮助最大的答案。好的,我明白了。。。嗯,但是第五行被删除了?如果存在矢量化,性能很重要,不要使用应用解决方案,因为应用是引擎盖下的循环。
import numpy as np
import pandas as pd

a = pd.DataFrame({ 'A':[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                   'B':[np.nan,np.nan,np.nan,np.nan,np.nan,4],
                   'C':[7,np.nan,9,np.nan,2,np.nan],
                   'D':[1,3,np.nan,7,np.nan,np.nan],
                   'E':[np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})

print (a)

         A    B    C    D   E
      0 NaN  NaN  7.0  1.0 NaN
      1 NaN  NaN  NaN  3.0 NaN
      2 NaN  NaN  9.0  NaN NaN
      3 NaN  NaN  NaN  7.0 NaN
      4 NaN  NaN  2.0  NaN NaN
      5 NaN  4.0  NaN  NaN NaN

a_new = a.apply(lambda x: pd.Series(x.dropna().values)).dropna(axis='columns')

print(a_new)

       C    D
   0  7.0  1.0
   1  9.0  3.0
   2  2.0  7.0