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, 時間類型索引,強大的日期和時間的方法支持;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM