-
更方便的数据查询:df.loc[index, :]
-
使用index会提升查询性能
- 如果index,是唯一的,Pandas会使用哈希表优化,查询性能为O(1);最快
- 如果index不是唯一的,但是有序,Pandass会使用二分查找算法,查询性能为O(logN); 其次
- 如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N): 最慢
-
自动的数据对齐功能;
-
使用index.更多更强大的数据结构支持
很多强大的索引数据结构-
Categoricallndex,基于分类数据的Index,提升性能;
-
Multilndex,多维索引,用于groupby多维聚合后结果等;
-
Datetimelndex,时间类型索引,强大的日期和时间的方法支持:
-
import pandas as pd
from random import shuffle
import time
df = pd.read_csv('./ml-latest-small/ratings.csv')
# print(df)
# 2. 使用index可以获得性能提升;
# 生成三个index,idx为唯一且有序的,idx2为唯一但无序的,idx3为不唯一且无序, idx4为不唯一但有序
idx = [i for i in range(df.shape[0])] # 唯一, 有序
idx4 = idx[0:10000] + idx[0:df.shape[0] - 10000] # 不唯一,有序
idx4.sort()
idx2 = idx.copy() # 唯一,无序
shuffle(idx2)
idx3 = idx2[0:10000] + idx2[0:df.shape[0] - 10000] # 不唯一,乱序
def func(l):
global df
df.set_index(pd.Series(l), inplace=True)
t = time.time()
for i in range(10000):
s = df.loc[10000, "rating"]
# 返回index是否唯一,是否有序,时间差
return df.index.is_unique, df.index.is_monotonic_increasing | df.index.is_monotonic_decreasing, time.time() - t
td = func(idx)
td4 = func(idx4)
td2 = func(idx2)
td3 = func(idx3)
print("唯一,有序index:", td)
print("唯一,无序index:", td2) # 和第一种基本相同,唯一,无序要快一点
print("不唯一,有序index:", td4)
print("不唯一,无序index:", td3)
输出结果:
唯一,有序index: (True, True, 0.06778979301452637)
唯一,无序index: (True, False, 0.0657961368560791)
不唯一,有序index: (False, True, 1.0023202896118164)
不唯一,无序index: (False, False, 1.6924288272857666)
自动对其功能,当index会自动对齐,不存在的行会变为nan,测试如下:
td = func(idx)
td4 = func(idx4)
td2 = func(idx2)
td3 = func(idx3)
print("唯一,有序index:", td)
print("唯一,无序index:", td2) # 和第一种基本相同,唯一,无序要快一点
print("不唯一,有序index:", td4)
print("不唯一,无序index:", td3)
# 3. 自动对其功能,当index会自动对齐,不存在的行会变为nan
df2 = pd.DataFrame({"a": [0, 1, 2], "b": [3, 4, 5]}, index=[0, 1, 2])
df3 = pd.DataFrame({"a": [6, 7, 8], "b": [6, 7, 8]}, index=[1, 2, 3])
df4 = df2 + df3
# print(df2)
# print(df3)
print(df4)
输出结果:
a b
0 NaN NaN
1 7.0 10.0
2 9.0 12.0
3 NaN NaN



