【问题标题】:How to apply pandas.DataFrame.dropna on a subset of columns with inplace = True and axis = 1?如何将pandas.DataFrame.dropna应用于inplace = True和axis = 1的列子集?
【发布时间】:2018-12-04 15:29:45
【问题描述】:
import pandas as pd

df = pd.DataFrame({
    'col1': [99, None, 99], 
    'col2': [4, 5, 6], 
    'col3': [7, None, None]})

col_list = ['col1', 'col2']
df[col_list].dropna(axis=1, thresh=2, inplace = True)

这会返回一个警告并保持数据框不变:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

以下内容不会产生警告,但仍保持 DataFrame 不变。

df.loc[:,col_list].dropna(axis=1, thresh=2, inplace=True) 

问题:

  1. 从用户指定的列列表中,从数据框中删除那些具有小于“thresh”非空值的列。不对列表中没有的列进行任何更改。
  2. 我需要使用 inplace=True 来避免复制数据框,因为它很大

我无法遍历列并一次应用 dropna 列,因为 pandas.Series.dropna 没有“thresh”参数。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    有趣的是,dropna 不支持此功能,但有一种解决方法。

    v = df[col_list].notna().sum().le(2)    # thresh=2 
    df.drop(v.index[v], axis=1, inplace=True)
    

    顺便说一句,

    我需要使用 inplace=True 来避免复制数据框

    很遗憾地通知您,即使使用inplace=True,也会生成一个副本。唯一的区别是副本被原地分配回原始对象,因此不会返回新对象。

    【讨论】:

    • 希望我们有一个内置的any() 函数至少可以处理 2 个项目。无论如何+1!
    【解决方案2】:

    我认为问题在于 df['col_list'] 或者切片会创建一个新的 df 和 inplace=True 影响该 df 而不是原来的。

    您可能必须使用dropna 的subset 参数并将列列表传递给它。

    df.dropna(axis=1, thresh=2, subset=col_list,inplace = True)

    【讨论】:

    • 这是评论,不是答案。
    • 我想删除列,所以我必须有 axis=1。而当axis=1时,subset不能是列列表;它只能是行索引的列表。
    • df.dropna(axis=1, thresh=2, subset=col_list,inplace = True) 不起作用。你试过了吗?
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多