#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Попытка удалить нулевые значения, относящиеся к индексу, в многоуровневом индексе
Я пытаюсь удалить все идентификаторы (уровень индекса 1), которые содержат какие-либо нули в столбце «Данные».
В качестве примера я создал образец фрейма данных ниже:
import pandas as pd
import numpy as np
ids = ['0', '0', '0', '0', '0', '1','1','1','1','1','2','2','2','2','2','3','3','3','3','3']
dates = ['1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21','1/1/21', '1/2/21', '1/3/21', '1/4/21', '1/5/21']
data = [np.nan, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, np.nan, 16, 17, 18, 19]
df = pd.DataFrame(data=data, index=[ids,dates], columns=['Data'])
Я хочу очистить фрейм данных, чтобы эффективно возвращать только строки, относящиеся к которым ID равен 1 или 2, потому что это единственные идентификаторы без нулевых значений для любой из дат на втором уровне индекса.
Я пробовал df.dropna(subset=['Data'], inplace=True)
, но это удаляет только строки с нулевыми значениями, а не весь индекс.
Каков наилучший способ удалить все строки, относящиеся к индексу, если какая-либо из этих строк имеет нулевое значение в фрейме данных Pandas?
Комментарии:
1. аналогично ответу @wwnde:
df.loc[~df.groupby(level=0).Data.transform(lambda x: x.isna().any())]
Ответ №1:
Определите andex, у которого есть какой-либо NaN, и отфильтруйте обратное
df.groupby(level=0).filter(lambda x:~(x.isna().any()))
как было предложено @sammywemmy, они также могут фильтровать группы, которые не NaNs
используются x.notna().all()
. Код ниже;
df.groupby(level=0).filter(lambda x: (x.notna().all()))
Data
1 1/1/21 5.0
1/2/21 6.0
1/3/21 7.0
1/4/21 8.0
1/5/21 9.0
2 1/1/21 10.0
1/2/21 11.0
1/3/21 12.0
1/4/21 13.0
1/5/21 14.0
Комментарии:
1. Это также работает :
df.groupby(level=0).filter(lambda x: (x.notna().all()))
2. Если я хочу конкретно ссылаться на столбец «Данные» (в моих фактических данных больше столбцов), как я могу это применить?
3. Давайте попробуем
df.groupby(level=0).filter(lambda x:~(x['Data'].isna().any()))
Ответ №2:
Я также мог использовать df.loc[~df.index.get_level_values(0).isin(df.loc[df['Data'].isna()].index.get_level_values(0))]
, но это гораздо менее pythonic.