把數據存儲於普通的column列也能用於數據查詢,那使用index有什么好處?
index的用途總結:
-
更方便的數據查詢
-
使用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())
-
-
如果index不是唯一的,但是有序,Pandas會使用二分查找算法,查詢性能為O(logN)
-
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))
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))
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)
-
CategoricalIndex, 基於分類數據的index,提升性能;
-
MultiIndex, 多維索引,用於groupby多維聚合后結果等;
-
DatetimeIndex, 時間類型索引,強大的日期和時間的方法支持;