zoukankan      html  css  js  c++  java
  • 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, 时间类型索引,强大的日期和时间的方法支持;

  • 相关阅读:
    npx小工具
    2015 Multi-University Training Contest 1
    字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
    AC自动机
    AC自动机
    区间合并 --- Codeforces 558D : Gess Your Way Out ! II
    暴力 + 贪心 --- Codeforces 558C : Amr and Chemistry
    计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
    Ubuntu 16.04 安装mysql并设置远程访问
    数学 --- 高斯消元 POJ 1830
  • 原文地址:https://www.cnblogs.com/xingxingnbsp/p/13851900.html
Copyright © 2011-2022 走看看