如何在inplace = True和axis = 1的列子集中应用pandas.DataFrame.dropna?

时间:2018-06-26 02:02:39

标签: python pandas

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. 从用户指定的列列表中,从数据框中删除那些具有少于“阈值”非空值的列。不更改不在列表中的列。
  2. 我需要使用inplace = True避免复制数据框,因为它非常庞大

因为pandas.Series.dropna没有'thresh'参数,所以我无法循环遍历这些列并一次仅将dropna应用于一列。

2 个答案:

答案 0 :(得分: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,也会生成一个副本。唯一的区别是,副本将原位分配回原始对象,因此不会返回新对象。

答案 1 :(得分:0)

我认为问题是df['col_list']或切片会创建新的df,并且对该df而不是原始df产生inplace=True效果。

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

dropna