#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]}
Что я хочу, так это:
- Удалить все
nan
, включая столбцы, кроме изcol4
- Получить данные, где
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()