Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我不理解pandas.drop的行为,因为我从dropna得到了不同的结果(删除了太多行)_Python_Pandas - Fatal编程技术网

Python 我不理解pandas.drop的行为,因为我从dropna得到了不同的结果(删除了太多行)

Python 我不理解pandas.drop的行为,因为我从dropna得到了不同的结果(删除了太多行),python,pandas,Python,Pandas,我有一个带有一些NA的数据框,我想删除特定列具有NA值的行 我的第一次试验是: -标识指定列值的行 -把它们递给熊猫 在我的具体例子中,我有一个39164行乘40列的数据帧。 如果我查看特定列中的NA,我会发现17715个相关标签,这些标签保存到一个专用变量中。然后我把它们送给了熊猫。预计还有22000行,但我只得到了2001行。 如果我使用pandas.dropna(),我还剩下21449行,这正是我所期望的 下面是我的代码。 第一个代码部分从gouv.fr下载数据(很抱歉没有使用假数据…但执

我有一个带有一些NA的数据框,我想删除特定列具有NA值的行

我的第一次试验是: -标识指定列值的行 -把它们递给熊猫

在我的具体例子中,我有一个39164行乘40列的数据帧。 如果我查看特定列中的NA,我会发现17715个相关标签,这些标签保存到一个专用变量中。然后我把它们送给了熊猫。预计还有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 vs data_2),结果非常不同。通过dropna()获得的数据_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\u reelle\u bati
,则所有四十行都将从
data\u 1
中消失。这就是为什么在创建
数据\u 1
时比在创建
数据\u 2
时删除更多行的原因

要解决此问题,请使用
reset_index()
使索引从0变为
数据的行数

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)

你忘了把结果粘贴进去了吗?数据_1和数据_2有多大区别?另外,我不知道为什么要使用data.index。我真的不知道该怎么做,但我会使用
data\u 1=data.drop(data.surface\u reelle\u bati.isna())
。我没想到索引可能有重复项……但我错了。。。