Как применить pandas.DataFrame.dropna к подмножеству столбцов с inplace = True и axis = 1? - PullRequest
0 голосов
/ 26 июня 2018
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

Следующее предупреждение не генерирует, но все же оставляет кадр данных без изменений.

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

Проблема:

  1. Из списка столбцов, указанных пользователем, удалите те столбцы данных из кадра данных, у которых меньше «пороговых» ненулевых значений.Не вносите изменений в столбцы, которых нет в списке.
  2. Мне нужно использовать inplace = True, чтобы избежать создания копии кадра данных, поскольку он огромен

Я не могуЗацикливайте столбцы и применяйте dropna по одному столбцу за раз, потому что pandas.Series.dropna не имеет аргумента thresh.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Как ни странно, dropna не поддерживает эту функцию, но есть обходной путь.

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

Кстати,

Мне нужно использовать inplace = Trueво избежание создания копии фрейма данных

Извините, что сообщаю, что даже при inplace=True создается копия.Единственное отличие состоит в том, что копия присваивается исходному объекту на месте, поэтому новый объект не возвращается.

0 голосов
/ 26 июня 2018

Я думаю, что проблема в df['col_list'] или срезы создают новый df и inplace=True эффекты для этого df, а не для исходного.

Возможно, вам придется использовать subset param of dropna и передайте ему список столбцов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...