【问题标题】:Python - Data CleaningPython - 数据清洗
【发布时间】:2019-03-15 07:29:15
【问题描述】:

我有一个形状为 (42538, 145) 的数据框,其中有超过 50 列,所有行的值都为 NaN

我想删除这些列而不指定 df.drop 中的每个列名。

【问题讨论】:

  • 这里已经回答了这个问题:stackoverflow.com/questions/13413590/…
  • 您确实不应该将示例数据作为图像提供。将图像粘贴到文本编辑器并使用它是不可能的。您绝对应该发布的是预期的输出以及您迄今为止尝试过的任何代码。

标签: python python-3.x python-2.7 pandas indexing


【解决方案1】:

您可能希望从 df.notnull 开始获取所有非 NaN 的位置。

然后您可以在结果上使用df.any,将axis 设置为零以检查所有列是否存在非全NaNness。

生成的布尔系列可用于索引您的列:Pandas Select DataFrame columns using boolean。有几种不同的选择:

df = df.iloc[:, df.notnull().any(axis=0).values]

sel = df.notnull().any(axis=0)
df = df[sel.index[sel]]

【讨论】:

    【解决方案2】:

    您可以使用pd.DataFrame.dropna 而非axis=1

    df = pd.DataFrame({'A': [1, 2, 3], 'B': [np.nan]*3,
                       'C': [4, 5, 6], 'D': [np.nan]*3})
    
    df_new = df.dropna(axis=1)
    
    print(df_new)
    
       A  C
    0  1  4
    1  2  5
    2  3  6
    

    【讨论】:

    • 进一步,您可以将参数“how”设置为“all”:pandas.DataFrame.dropna (how = 'all') 如果所有值都为 NA,则删除行或列。默认情况下如何 = '任何'。 pandas.DataFrame.dropna
    【解决方案3】:

    试试这个:

    tmp_col = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]
    df1.columns = tmp_col
    
    df2 = df1[(df1[2] == 'RO En') | (df1[2] == 'RO En Adj')]
    df2[['bp1','bp2']] = df2[6].str.split('-',expand=True)
    df2[['mn1','mn2']] = df2[11].str.split(' ',expand=True)
    
    df2['FN'] = df2[10] + ' ' + df2[11]
    
    
    df2.loc[df2[2] == 'RO ', 'RT'] = ''
    df2.loc[df2[2] == 'RO ', ''] = ''
    df2.loc[df2[2] == 'RO ', ''] = df2['bp1']
    df2.loc[df2[2] == 'RO ', ''] = df2[12]
    
    
    df3 = df2[df2[8].str.contains('')]
    df4 = df2[df2[8].str.contains(')]
    
    print(df3,df4)
    
    pm_col = []
    
    df3 = df3[[10,11,'BP',16,15,15,17,15,'RT',14,21,19,'FN','mn2']]
    
    df3.columns = pm_col
    
    df4 = df4[[10,11,'BP',16,15,15,17,15,'RT',14,21,19,'FN','mn2']]
    df4.columns = pm_col
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。
    • 请正确格式化您的代码,click here to learn how
    猜你喜欢
    • 2021-02-04
    • 2021-11-21
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多