Удаление индексов с нулевыми значениями в столбце в Pandas

#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.