Pandas系列教程(11)Pandas的索引index

Pandas的索引index

把数据存储于普通的column列也能用于数据查询,那使用index有什么好处?

index的用途总结:

  1. 更方便的数据查询

  2. 使用index可以获得性能上的提升

  3. 自动的数据对其功能

  4. 更多更强大的数据结构支持

1、使用index查询数据

import pandas as pd

df = pd.read_csv('../../datas/files/ratings.csv')
print('*' * 25, '1. 读取csv文件,打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '计算条数', '*' * 25)
print(df.count())

# -------------------- 1. 使用index查询数据 ------------------------ #
# drop==False,让索引列还保持在column
df.set_index('userId', inplace=True, drop=False)
print('*' * 25, '打印前几行数据', '*' * 25)
print(df.head())
print('*' * 25, '打印索引', '*' * 25)
print(df.index)

# 使用index的查询方法
print('*' * 25, '使用index的查询方法', '*' * 25)
print(df.loc[500].head(5))

# 使用column的condition查询方法
print('*' * 25, '使用column的condition查询方法', '*' * 25)
print(df.loc[df['userId'] == 500].head())

2、使用index会提升查询性能

  • 如果index是唯一的,Pandas会适应哈希表优化,查询性能为O(1);

  • 如果index不是唯一的,但是有序,Pandas会使用二分查找算法,查询性能为O(logN)

  • 如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N);

实验一:完全随机的顺序查询

import pandas as pd
import timeit
from sklearn.utils import shuffle

df = pd.read_csv('../../../datas/files/ratings.csv')
print('*' * 25, '1. 读取csv文件,打印前几行数据', '*' * 25)
print(df.head())

# 将数据随机打散
print('*' * 25, '2. 将数据随机打散,打印前几行数据', '*' * 25)
df_shuffle = shuffle(df)
print(df_shuffle.head())

# 判断索引是否是递增的
print('*' * 25, '3. 判断索引是否是递增的', '*' * 25)
print(df_shuffle.index.is_monotonic_increasing)

# 判断索引是否唯一
print('*' * 25, '4. 判断索引是否唯一', '*' * 25)
print(df_shuffle.index.is_unique)

# 计时查询id==500的数据查询性能
print('*' * 25, '4. 计时查询id==500的数据查询性能', '*' * 25)
def test():
    return df_shuffle.loc[500]
print(timeit.timeit(stmt=test, number=10))

实验二:将index排序后的查询

import pandas as pd
import timeit
from sklearn.utils import shuffle

df = pd.read_csv('../../../datas/files/ratings.csv')
print('*' * 25, '1. 读取csv文件,打印前几行数据', '*' * 25)
print(df.head())

# 将数据随机打散
print('*' * 25, '2. 将数据随机打散,打印前几行数据', '*' * 25)
df_shuffle = shuffle(df)
print(df_shuffle.head())

# 将数据按照index排序
print('*' * 25, '3. 将数据按照index排序,打印前几行数据', '*' * 25)
df_sorted = df_shuffle.sort_index()
print(df_sorted.head())

# 判断索引是否是递增的
print('*' * 25, '4. 判断索引是否是递增的', '*' * 25)
print(df_sorted.index.is_monotonic_increasing)

# 判断索引是否唯一
print('*' * 25, '5. 判断索引是否唯一', '*' * 25)
print(df_sorted.index.is_unique)

# 计时查询id==500的数据查询性能
print('*' * 25, '5. 计时查询id==500的数据查询性能', '*' * 25)
def test():
    return df_sorted.loc[500]
print(timeit.timeit(stmt=test, number=10))

使用index能自动对齐数据

import pandas as pd

s1 = pd.Series([1, 2, 3], index=list('abc'))
print(s1)

s2 = pd.Series([2, 3, 4], index=list('bcd'))
print(s2)

print(s1 + s2)

使用index更多更强大的数据结构支持

  • CategoricalIndex, 基于分类数据的index,提升性能;

  • MultiIndex, 多维索引,用于groupby多维聚合后结果等;

  • DatetimeIndex, 时间类型索引,强大的日期和时间的方法支持;

原文地址:https://www.cnblogs.com/xingxingnbsp/p/13851900.html