У меня есть фрейм данных, который выглядит следующим образом (образец ниже для справки, в оригинале гораздо больше столбцов):

sample table for dataframe

Я пытаюсь получить список строк, в которых все столбцы равны нулю (NaN), за исключением некоторых конкретных столбцов. Например, если эти конкретные столбцы - col2 и col3, я бы получил первую и третью строки. Если конкретные столбцы - это просто col1, я бы получил только последнюю строку.

Также подойдет подсчет строк, соответствующих этим критериям.

Я знаю, как это сделать, просматривая каждую строку и сравнивая, но есть ли более быстрый способ сделать это?

Благодарность!

0
Irina 25 Янв 2021 в 22:46

2 ответа

Лучший ответ

Можешь попробовать:

# specific columns
cols = ['col1','col2']

df[df.drop(cols, axis=1).isna().all(1)]

Это не будет проверять, есть ли у вас данные в cols. Если вам это нужно, вы можете:

other_nan = df.drop(cols, axis=1).isna().all(1)
chosen_notna = df[cols].notna().any(1)

df[other_nan & chosen_notna]
2
Quang Hoang 25 Янв 2021 в 20:13

Вот функция для этого. Я использовал difference, чтобы найти фрейм данных, исключая указанные столбцы, затем использовал isna() и all(), чтобы найти пустые строки:

def null_rows(df, exclude=None):
    exclude = [] if exclude is None else exclude
    return df[df[df.columns.difference(exclude)].isna().all(1)]

Примере:

df = pd.DataFrame({'col1': [None, 3, None, 8],
                   'col2': [1, None, 6, None],
                   'col3': [2, 4, 7, None],
                   'col4': [None, None, None, None],
                   'col5': [None, 5, None, None]})

print(null_rows(df, ['col2', 'col3']))

Выход:

   col1  col2  col3  col4  col5
0   NaN   1.0   2.0  None   NaN
2   NaN   6.0   7.0  None   NaN
1
Tom 25 Янв 2021 в 20:19
65891429