Pandas исключение строк на основе условий в DataFrame - PullRequest
0 голосов
/ 25 мая 2020

У меня есть DataFrame с информацией, хранящейся в столбце до неизвестного номера строки. После этого номера строки в столбце хранятся только значения NaN. Однако по всему столбцу также появляются случайные значения NaN. Я хочу, чтобы кумуляция проверила, сколько значений NaN повторяется для определения последней строки, в которой хранится информация.

Мой код выглядит следующим образом:

  1. сначала я создаю Проверка NaN, которая накапливает количество значений NaN в строке после строки

  2. далее, я проверяю, превышает ли средство проверки NaN определенный порог (в данном случае 3)

  3. последний, если порог превышен, последующие строки удаляются

Check_NaN =
Fruits['bananas'].isnull().astype(int).groupby(Fruits['bananas']
                .notnull().astype(int).cumsum()).sum() 
for row in Fruits:
    for cell in row['bananas']:
        if cell(Check_NaN) < 3:
            sum_Fruits.update(Fruits)
        else:
            row.dropna(subset=['bananas'])

Ниже приведен образец данных для Fruits['bananas'] . Это строки 110-130, из которых конец информации Excel в DataFrame указывается началом значений NaN.

110         banana red
111    banana green
112      banana white
113         banana yellow
114    banana black
115       banana orange
116     banana purple
117     banana pink
118     banana blue
119     banana silver
120     banana grey
121     banana gold
122       banana white
123       banana orange
124                    --
125                   NaN
126                   NaN
127                   NaN
128                   NaN
129                   NaN

Однако я сталкиваюсь с проблемой, которая находится в for cell in row['bananas']:, что дает TypeError: string indices must be integers.

Меня это сбивает с толку, поскольку я не могу перебирать строки, которые я хочу удалить. Мне нужен многоразовый код, так как начало значений NaN отличается для каждого листа Excel. Как я могу написать свой сценарий так, чтобы порог в 3 значения NaN понимался и удалял остальные строки?

1 Ответ

1 голос
/ 25 мая 2020

Для этого вы можете посмотреть на функцию сдвига в Pandas, затем сдвинуть дважды и проверить, все ли три значения равны NaN

Попробуйте следующее:

# Find the rows where itself and the two subsequent rows are null in the bananas column
All_three_null = Fruits[‘banana’].isna() & Fruits[‘banana’].shift(-1).isna() & Fruits[‘banana’].shift(-2).isna()

# Find the index of the first row where this happens
First_instance = Fruits[All_three_null].index.min()

# Filter the data to remove all the null rows
Good_data = Fruits[Fruits.index <= First_instance]

Другой вариант, который будет лучше, если вы хотите перейти от 3 NaNs в строке к 30!

Основная идея c состоит в том, чтобы сгруппировать все последующие события NaN в однозначно идентифицируемую группу, а затем найти первая группа, которая превышает установленный предел и использует эту группу для фильтрации исходного DataFrame

NaN_in_a_Row = 3

Fruits['Row_Not_NaN'] = Fruits['banana'].notna()
Fruits['First_Nan_After_Not_Nan'] = Fruits['banana'].isna() & Fruits['banana'].shift(1).notna()
Fruits['Group_ID'] = (Fruits['Row_Not_Nan']+Fruits['First_Nan_After_Not_Nan']).cumsum()
Fruits['Number_of_Rows'] = 1

Filter = Fruits.groupby(['Group_ID'])['Number_of_Rows'].sum()
Filter = Filter[Filter["Number_of_Rows"]>=NaN_in_a_Row].Group_ID.min()

Fruits = Fruits[Fruits.Group_ID < Filter]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...