【问题标题】:Remove NaNs from Dataframe? [duplicate]从数据框中删除 NaN? [复制]
【发布时间】:2019-09-15 06:32:00
【问题描述】:

我有以下代码:

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

【问题讨论】:

  • 如果每列的非空值数量不相等会怎样?
  • @Vaishali 由于采取的样本,我应该始终在每列中填充相同数量的填充值。

标签: python python-3.x pandas null


【解决方案1】:

另一种可能的解决方案是使用 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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 2016-06-16
        • 2021-06-14
        • 2019-11-19
        • 1970-01-01
        • 2017-11-12
        • 2018-02-24
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多