栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pandas 10. 索引index的用途

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Pandas 10. 索引index的用途

Pandas的索引index的用途 index的用途总结:
  1. 更方便的数据查询:df.loc[index, :]

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

    • 如果index,是唯一的,Pandas会使用哈希表优化,查询性能为O(1);最快
    • 如果index不是唯一的,但是有序,Pandass会使用二分查找算法,查询性能为O(logN); 其次
    • 如果index是完全随机的,那么每次查询都要扫描全表,查询性能为O(N): 最慢
  3. 自动的数据对齐功能;

  4. 使用index.更多更强大的数据结构支持
    很多强大的索引数据结构

    • Categoricallndex,基于分类数据的Index,提升性能;

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

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

示例 使用index可以获得性能提升,测试如下:
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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/948145.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号