Я не понимаю поведение pandas.drop, так как я получаю разные результаты от dropna (слишком много строк пропущено) - PullRequest
1 голос
/ 21 октября 2019

У меня есть DataFrame с некоторым NA, и я хочу удалить строки, в которых у определенного столбца есть значения NA.

Моим первым испытанием было: - Определение строк, в которых значения определенных столбцов были NA - Passих в pandas.drop ()

В моем конкретном случае у меня есть DataFrame 39164 строк на 40 столбцов. Если я посмотрю на NA в определенных столбцах, то обнаружу 17715 связанных ярлыков, которые я сохранил в выделенную переменную. Затем я отправил их в pandas.drop (), ожидая, что осталось около 22000 строк, но я получил только 2001. Если я использую pandas.dropna (), у меня останется 21449 строк, что я и ожидал.

Здесьследует моему кодуПервая часть кода загружает данные с gouv.fr (извините за то, что вы не используете поддельные данные ... но выполнение займет не более 10 секунд). ВНИМАНИЕ: только последние 5 лет хранятся в онлайн-базе данных. Так что мой пример должен быть адаптирован позже ...

import pandas as pd

villes = {'Versailles' : '78646',
          'Aix-en-Provence' : '13001'}
years = range(2014,2019)

root = "https://cadastre.data.gouv.fr/data/etalab-dvf/latest/csv/"
data = pd.DataFrame({})

for ville in villes.keys() :
    for year in years :
        file_addr = '/'.join([root,str(year),'communes',villes[ville][:2],villes[ville]+'.csv'])
        print(file_addr)
        tmp = pd.read_csv(file_addr)
        data =pd.concat([data,tmp])

Это вторая часть, где я пытаюсь отбросить несколько строк. Как уже говорилось, результаты сильно различаются в зависимости от выбранной стратегии (данные_1 против данных_2). data_2, полученные dropna () - это ожидаемые результаты.

print(data.shape)
undefined_surface = data.index[data.surface_reelle_bati.isna()]
print(undefined_surface)
data_1 = data.drop(undefined_surface)
data_2 = data.dropna(subset=['surface_reelle_bati'])
print(data_1.shape)
print(data_2.shape)

Использование dropna () полностью подходит для меня, но я хотел бы понять, что я делал неправильно с drop (), так как я получилочень глупый результат по сравнению с моими ожиданиями, и я хотел бы знать об этом в будущем ... Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 21 октября 2019

Это потому, что ваш индекс не уникален, посмотрите, например, на индекс 0, у вас есть сорок строк с этим индексом

data_idx0 = data.iloc[0]
data_idx0.shape
# (40,)

Если хотя бы в одной из строк с индексом 0 отсутствует surface_reelle_bati, отсутствуетвсе сорок рядов исчезнут из data_1. Вот почему вы пропускаете больше строк при создании data_1, чем при создании data_2.

. Чтобы решить эту проблему, используйте reset_index(), чтобы индекс перешел от 0 к числу строк data

data = data.reset_index()
undefined_surface = data.index[data.surface_reelle_bati.isna()].tolist()
data_1 = data.drop(undefined_surface)
print(data_1.shape)
# (21449, 41)
data_2 = data.dropna(subset=['surface_reelle_bati'])
print(data_2.shape)
# (21449, 41)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...