首页 > 解决方案 > 如何将pandas.DataFrame.dropna应用于inplace = True和axis = 1的列子集?

问题描述

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”参数。

标签: pythonpandas

解决方案


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

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

顺便一提,

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

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


推荐阅读