Получение данных о наличии нулевых значений в определенном столбце и удаление других нулевых столбцов

#python #pandas #dataframe #filter #null

#python #pandas #dataframe #Фильтр #null

Вопрос:

У меня есть фрейм данных, подобный этому:

 rawdata = {'col1': [3 ,nan ,4 ,7 ,nan ,5], 
'col2': [10 ,20 ,10 ,30 ,10 ,40], 
'col3': [23 ,34 ,45 ,56 ,34 ,23], 
'col4': [5 ,4 ,nan ,5 ,1 ,nan], 
'col5': [28 ,33 ,33 ,4 ,nan ,44]}
  

Что я хочу, так это:

  1. Удалить все nan , включая столбцы, кроме из col4
  2. Получить данные, где col4 находится nan

В конце концов, мне нужно иметь ниже:

 target = {'col2': [10 ,40],
'col3': [45 ,23], 
'col4': [nan ,nan]}
  

Вот код:

 rawdata.drop(["col1", "col5"], axis = 1, inplace= True)
rawdata = rawdata[rawdata.isnull().any(axis=1)][rawdata .columns[rawdata .isnull().any()]]
  

Однако это возвращает мне только сам col4. Мне тоже нужны col2 и col3.

Комментарии:

1. Привет, я предлагаю вам опубликовать код для фрейма данных, чтобы мы могли скопировать ваш фрейм данных на нашей стороне и помочь вам с вашей проблемой. Публикация изображения фрейма данных не помогает.

Ответ №1:

Предполагая, что вы согласны с простым жестким кодированием столбцов, содержащих nan (как следует из вашего собственного примера), это просто сводится к df.drop(['col1', 'col5'], axis=1)[df.col4.isna()] . С вашими тестовыми данными:

 In [13]: df
Out[13]:
   col1  col2  col3  col4  col5
0   3.0    10    23   5.0  28.0
1   NaN    20    34   4.0  33.0
2   4.0    10    45   NaN  33.0
3   7.0    30    56   5.0   4.0
4   NaN    10    34   1.0   NaN
5   5.0    40    23   NaN  44.0

In [14]: df.drop(['col1', 'col5'], axis=1)[df.col4.isna()]
Out[14]:
   col2  col3  col4
2    10    45   NaN
5    40    23   NaN
  

Если вы предпочитаете не жестко кодировать эти столбцы, другой подход был бы

 In [35]: df.drop(df.columns[df.isna().any()].difference({'col4'}), axis=1)[df.col4.isna()]
Out[35]:
   col2  col3  col4
2    10    45   NaN
5    40    23   NaN
  

Комментарии:

1. Спасибо! Это работает! Но теперь у меня другая проблема. Мне нужно прочитать имя столбца из списка. Предположим, что есть список, и в нем есть 'col4' элемент: mylist = ['col4'] . Как я должен поступить [df.col4.isna()] , сославшись на имя столбца mylist .

2. @BTurkeli Предполагая, что имя столбца является первой записью списка, вы могли бы сделать df[mylist[0]].isna() .

3. Точно! Это дух ‘dataframe’, которого у меня пока нет!

Ответ №2:

Я предполагаю, что здесь вы создали фрейм данных с df = pd.DataFrame(rawdata)

Сначала я бы построил серию, содержащую столбцы для сохранения:

 keep = df.count() == len(df)
deep['col4'] = True
  

Тогда то, что вы хотите, это просто:

 df.loc[df.col4.isna(), keep]
  

что дает ожидаемый результат:

    col2  col3  col4
2    10    45   NaN
5    40    23   NaN
  

Если вам нужен dict, это просто df.loc[df.col4.isna(), keep].to_dict()