我正在学习post
此代码用于对自动mpg数据集进行探索性数据分析。
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
'Acceleration', 'Year', 'Origin', 'Name']
df = pd.read_csv(url, names=column_names, sep='\s+', na_values="?")
# The last column (name) is a unique id for the car, so we drop it
df = df.drop(columns=['Name'])
df.info()
关注输出的这一部分
RangeIndex: 398 entries, 0 to 397
将是
Int64Index: 392 entries, 0 to 397
删除缺失值后
df = df.dropna()
df.info()
考虑删除了6行,为什么索引范围仍为0到397?
答案 0 :(得分:1)
当您将列放在熊猫中时,索引不会重置。因此索引仍然会从0到398,但是对于删除的记录,索引中会出现“空洞”。运行df.shape
,您可以看到实际上已删除行。要重置索引,您可以运行
df = df.reset_index()
df.index
,您会看到索引从0到392符合您的预期
答案 1 :(得分:1)
Pandas创建了一个新的数据框,其中删除了一些记录。它不会重新索引数据框。结果是在新数据帧中具有索引的记录对应于在旧数据帧中具有相同索引的记录。新数据框的索引将对应于新数据框的索引。在您的示例中,最终索引的范围是0到397,但是它不包含0到397的所有值。如果原始索引是vin-prefix或更有意义,则您可能会期望此行为。
在dropna之前
In : df.index
Out: RangeIndex(start=0, stop=398, step=1)
但是在dropna之后
Out: Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
...
388, 389, 390, 391, 392, 393, 394, 395, 396, 397],
dtype='int64', length=392)
您可以通过索引之间的.difference
调用来获得确切的差异。
df_before.index.difference(df_after.index)
Int64Index([32, 126, 330, 336, 354, 374], dtype='int64')