python - 我不明白 pandas.drop 的行为,因为我从 dropna 得到不同的结果(删除了太多行)

标签 python pandas

我有一个带有一些 NA 的 DataFrame,我想删除特定列具有 NA 值的行。

我的第一次尝试是: - 识别特定列值为 NA 的行 - 将它们传递给 pandas.drop()

在我的具体情况下,我有一个 39164 行 x 40 列的 DataFrame。 如果我查看特定列中的 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])

这是第二部分,我尝试删除一些行。如前所述,根据所选策略(data_1 与 data_2)的不同,结果有很大不同。 dropna()得到的data_2是预期结果。

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() 做错了什么,因为与我的期望相比,我得到了一个非常愚蠢的结果,我想在未来... 预先感谢您的帮助。

最佳答案

这是因为您的索引不是唯一的,例如查找索引 0,您有 40 行包含此索引

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

如果索引为 0 的行中至少有一个缺少 surface_reelle_bati,则所有 40 行将从 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)

关于python - 我不明白 pandas.drop 的行为,因为我从 dropna 得到不同的结果(删除了太多行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58477429/

相关文章:

python - MergeError : Incompatible merge dtype, dtype ('O' ) 和 dtype ('O' ),双方都必须有数字 dtype

python - 想要将 dataset.info() 结果存储到 Python 中的数据框中

python - 在 Pandas 数据框中选择行

python - 如何停止 Python 脚本 - 仅当它正在调试时

python - Pandas 在关联的字符串值处将列添加到新数据框?

python - 如何衡量覆盖率(在生产系统中)?

python - 从列表项向字典添加新键时出错

根据行顺序连接两个 pandas 数据框

python - 如何使用包含可选模型的元组定义嵌套 Pydantic 模型?

python - Numpy 选择默认条件返回错误值