从数据框删除NaN?

时间:2019-04-25 18:47:10

标签: python python-3.x pandas null

我有以下代码:

sample_data = OrderedDict((df.name, df['col'].sample(n=3)) for df in test_cases[1:])
sample = pd.DataFrame(sample_data)

其中提供以下数据框:

col1   col2
A      NaN
P      NaN
NaN    E
NaN    R
U      NaN
NaN    Y

如何获取以下数据框:

 col1   col2
 A      E
 P      R
 U      Y

3 个答案:

答案 0 :(得分:2)

另一种可能的解决方案是使用 dropna() reset_index() concat()

pd.concat([df[x].dropna().reset_index(drop=True) for x in df.columns], axis=1)

代码

import pandas as pd
import numpy as np
li=[['A',np.nan],['P',np.nan],[np.nan,'E'],[np.nan,'R'],['U',np.nan],[np.nan,'Y']]
df=pd.DataFrame(li,columns=['col1','col2'])
df2=pd.concat([df[x].dropna().reset_index(drop=True) for x in df.columns], axis=1)
print(df2)

输出

  col1 col2
0    A    E
1    P    R
2    U    Y

答案 1 :(得分:1)

您可以使用列表推导找到非空值并重建数据框,

pd.DataFrame([df.loc[df[col].notna(), col].values for col in df.columns]).T


    0   1
0   A   E
1   P   R
2   U   Y

a = np.array([df.loc[df[col].notna(), col].values for col in df.columns]).T

pd.DataFrame(a, columns = df.columns)

    col1    col2
0   A       E
1   P       R
2   U       Y

答案 2 :(得分:0)

IIUC

df.apply(lambda x : sorted(x,key=pd.isnull)).dropna()
Out[485]: 
  col1 col2
0    A    E
1    P    R
2    U    Y

如果性能很重要,请检查justify