系列文章目录
第一章 Pandas 学习入门之pandas数据读取
第二章 Pandas 学习入门之pandas数据结构
第三章 Pandas 学习入门之pandas数据查询
第四章 Pandas 学习入门之pandas新增数据列
第五章 Pandas 学习入门之pandas数据统计函数
第六章 Pandas 学习入门之pandas处理缺失值
第七章 Pandas 学习入门之pandas数据排序
第八章 Pandas 学习入门之pandas字符串操作
第九章 Pandas 学习入门之pandas重要参数axis
第十章 Pandas 学习入门之pandas索引index用途
随着人工智能的不断发展,数据分析这门技术也越来越重要,很多人都开启了学习数据分析,本文就介绍了pandas学习的基础内容。本章简单介绍了pandas索引index的用途,index可以用来查询数据和自动对齐数据,使用index会大大提升数据查询的性能,总之,index具有强大的数据结构支持。
前言
本章简单介绍了pandas索引index的用途,index可以用来查询数据和自动对齐数据,使用index会大大提升数据查询的性能,总之,index具有强大的数据结构支持。
提示:以下是本篇文章正文内容,下面案例可供参考
一、pandas索引index的用途
index的用途总结:
- 更方便的数据查询;
- 使用index可以获得性能提升;
- 自动的数据对其功能;
- 更多更强大的数据支持;
二、引入库 & 数据准备
1.引入库
代码如下(示例):
import pandas as pd
2.数据准备
df = pd.read_csv("./datas/ratings.csv")
df.head()
userId | movieId | rating | timestamp | |
0 | 1 | 1 | 4 | 964982703 |
1 | 1 | 3 | 4 | 964981247 |
2 | 1 | 6 | 4 | 964982224 |
3 | 1 | 47 | 5 | 964983815 |
4 | 1 | 50 | 5 | 964982931 |
... | ... | ... | ... | ... |
100831 | 610 | 166534 | 4 | 1493848402 |
100832 | 610 | 168248 | 5 | 1493850091 |
100833 | 610 | 168250 | 5 | 1494273047 |
100834 | 610 | 168252 | 5 | 1493846352 |
100835 | 610 | 170875 | 3 | 1493846415 |
df.count()
userId 100836 movieId 100836 rating 100836 timestamp 100836 dtype: int64
返回的是Series.
三、使用index查询数据
# drop=False,让索引还保持在column
df.set_index("userId",inplace=True,drop=False)
df.head()
set_index()方法允许将DataFrame中的一个或多个列转换为索引。
inplace=True参数意味着修改会直接在原DataFrame上进行,不会返回一个新的DataFrame。
drop=False参数确保在将列设置为索引的同时,该列在DataFrame中仍然作为普通列存在。
df.index
Index([ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ... 610, 610, 610, 610, 610, 610, 610, 610, 610, 610], dtype='int64', name='userId', length=100836)
df
# 保存
df.to_excel("rating_index.xlsx", index=True)
# index=True 表示索引列也保存
# 使用index的查询方法
df.loc[500].head()
# 使用column的condition查询方法
df.loc[df["userId"] == 500].head()
四、使用index会提升查询性能
- 如果index是唯一的,Pandas会使用哈希表优化,查询性能为O(1);
- 如果index不是唯一的,但是有序,Pandas会使用二分查找算法,查询性能为O(logN);
- 如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N);
1.实验1:完全随机的顺序查询
# 将数据随机打散
from sklearn.utils import shuffle
df_shuffle = shuffle(df)
df_shuffle.head()
代码详解:
- 在使用
sklearn.utils.shuffle
函数将Pandas DataFrame的数据随机打散时,你需要首先确保已经安装了scikit-learn
库,因为shuffle
函数是从这个库中提供的。- 此函数的目的是对数据进行随机重排,这在很多情况下很有用,比如在划分训练集和测试集之前,确保数据的随机性,从而避免因数据排序导致的偏差。
shuffle
函数默认会重置索引,返回的df_shuffle
将具有从0开始的新索引。如果你希望保留原始索引,可以使用shuffle(df, random_state=42).reset_index(drop=True)
。- 你可以通过
random_state
参数设置一个随机种子,以确保每次打散的顺序相同,这在需要可重复的实验时很有用。- 确保在使用
shuffle
之前,你的数据已经是一个Pandas DataFrame对象。如果你的数据是其他格式(如NumPy数组),那么需要相应地调整。- 这种打散数据的方法在准备机器学习数据集时特别有用,可以帮助减少模型训练过程中的过拟合风险,并提高模型的泛化能力。
# 索引是否是递增的
df_shuffle.index.is_monotonic_increasing
False
DataFrame.index.is_monotonic_increasing
属性。此属性会返回一个布尔值(True或False),表明索引是否从小到大单调递增。
如果
is_increasing
的值为True
,说明索引是递增的;如果为False
,说明索引不是递增的。通常,在打乱数据后,除非你显式地调用了.reset_index(drop=True)
来重置索引,否则索引不会是递增的。这是因为shuffle
函数保留了原始数据的索引顺序,即使数据的顺序被打乱了。
# 检查索引是否是唯一的
df_shuffle.index.is_unique
False
.is_unique
属性用于检查DataFrame的索引是否是唯一的,即没有重复的索引值。如果索引是唯一的,它会返回True
;如果有任何重复的索引值,它会返回False
。
# 计时,查询id==500数据性能
%timeit df_shuffle.loc[500]
187 µs ± 1.27 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
测量查询
id==500
(这里假设id
是DataFrame的索引)在打散后的DataFramedf_shuffle
中的性能,可以使用%timeit。
如果你在查询之前没有将
id
设置为索引(假设id
仅是DataFrame中的一个列),这样的查询会非常慢,因为Pandas需要遍历整个DataFrame来查找符合条件的行。如果性能是一个关注点,为经常查询的列设置索引会是一个好的做法:df_shuffle.set_index('id', inplace=True)
2.实验2:将index排序后的查询
# 按索引升序排序
df_sorted = df_shuffle.sort_index()
df_sorted.head()
sort_index()
方法默认按照升序排列索引。如果你想按照降序排列索引,可以通过设置参数ascending=False
来实现。
# 按索引降序排序
df_sorted_desc = df_shuffle.sort_index(ascending=False)
df_sorted_desc.head()
# 索引是否是递增的
df_sorted.index.is_monotonic_increasing
True
df_sorted.index.is_unique
False
%timeit df_sorted.loc[500]
51.2 µs ± 4.03 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
五、使用index能自动对齐数据
包括series和dataframe:
s1 = pd.Series([1,2,3], index=list("abc"))
s1
a 1 b 2 c 3 dtype: int64
s2 = pd.Series([2,3,4], index=list("bcd"))
s2
b 2 c 3 d 4 dtype: int64
s1+s2
a NaN b 4.0 c 6.0 d NaN dtype: float64
这个结果中包含了所有在s1
和s2
中出现的索引,而且只有当某个索引在两个Series中都存在时,其对应的值才会是非NaN
的相加结果。
六、使用index更多更强大的数据结构支持
很多强大的索引数据结构:
- CategoricalIndex,基于分类数据的Index,提升性能;
- MultiIndex,多维索引,用于groupby多维聚合后结果等;
- DatetimeIndex,时间类型索引,强大的日期和时间的方法支持。
总结
提示:这里对文章进行总结:
随着人工智能的不断发展,数据分析这门技术也越来越重要,很多人都开启了学习数据分析,本文就介绍了pandas学习的基础内容。本章简单介绍了pandas索引index的用途,index可以用来查询数据和自动对齐数据,使用index会大大提升数据查询的性能,总之,index具有强大的数据结构支持。