Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >熊猫标量值的获取和设定: ix还是iat?

熊猫标量值的获取和设定: ix还是iat?
EN

Stack Overflow用户
提问于 2015-03-06 14:51:06
回答 1查看 6.7K关注 0票数 10

我想弄清楚什么时候在熊猫DataFrame中使用不同的选择方法。特别是,我正在寻找访问标量值的方法。我经常听到ix被普遍推荐。但在熊猫文献中,建议使用atiat进行快速标量值访问:

Since indexing with [] must handle a lot of cases (single-label access, slicing, boolean indexing, etc.), it has a bit of overhead in order to figure out what you’re asking for. If you only want to access a scalar value, the fastest way is to use theatand iat methods, which are implemented on all of the data structures.

因此,我假设iat应该更快地获取和设置单个单元格。但是,经过一些测试后,我们发现ix在读取单元格时具有可比性,或者更快,而iat用于为单元格分配值的速度要快得多。

这种行为在任何地方都有记录吗?情况总是如此吗?为什么会发生这种情况?它必须要做什么与返回视图或复制?如果有人能说明这个问题,并解释什么是获得和设置单元格值的建议,以及为什么,我将不胜感激。

下面是一些使用熊猫的测试(0.15.2版)。

为了确保此行为不是此版本的错误,我还在0.11.0上进行了测试。我没有提供结果,但趋势是完全相同的- ix being much faster for getting, and iat for setting individual cells

代码语言:javascript
运行
AI代码解释
复制
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(1000,2),columns = ['A','B'])
idx = 0

timeit for i in range(1000): df.ix[i,'A'] = 1
timeit for i in range(1000): df.iat[i,idx] = 2

>> 10 loops, best of 3: 92.6 ms per loop
>> 10 loops, best of 3: 21.7 ms per loop

timeit for i in range(1000): tmp = df.ix[i,'A'] 
timeit for i in range(1000): tmp = df.iat[i,idx] 

>> 100 loops, best of 3: 5.31 ms per loop
>> 10 loops, best of 3: 19.4 ms per loop
EN

回答 1

Stack Overflow用户

发布于 2015-03-10 23:03:06

熊猫在索引类上做了一些非常有趣的事情。我认为我无法描述一种简单的方法来知道使用哪种方法,但是我可以给出一些关于实现的见解。

DataFrame#ix是一个不声明自己的__getitem____setitem___IXIndexer。这两种方法很重要,因为它们控制如何使用Pandas访问值。因为_IXIndexer不声明这些方法,所以使用_NDFrameIndexer

_NDFrameIndexer__getitem__的进一步深入研究表明,它相对简单,在某些情况下封装了在get_value中找到的逻辑,然后在某些场景中__getitem__接近于get_value

_NDFrameIndexer__setitem__是一个不同的故事,起初它看起来很简单,但第二个方法是_setitem_with_indexer,它在大多数场景中做了大量的工作。

这些信息表明,在最好的情况下,使用ix获取值的调用受到get_value的限制,使用ix设置值的调用需要核心提交人来解释。

现在对于DataFrame#iat来说,它是一个_iAtIndexer,它也没有声明自己的__getitem____setitem__,因此回到了超类_ScalarAccessIndexer的实现上。

_ScalarAccessIndexer有一个__getitem__实现,但它需要一个循环才能将密钥转换成正确的格式。在调用get_value之前,附加循环会增加一些额外的处理时间。

_ScalarAccessIndexer还有一个公平的__setitem__实现,它在设置值之前转换set_value所需的键。

这些信息表明,使用iat获取值的调用受到get_value用于循环的限制。使用iat设置值主要受到对set_value的调用的限制。因此,使用iat获取值有一定的开销,而设置这些值的开销较小。

TL;博士

我相信您使用了基于文档的Int64Index索引的正确访问器,但我认为这并不意味着它是最快的。可以直接使用get_valueset_value找到最佳性能,但它们需要更深入地了解如何实现Pandas DataFrames。

Notes

值得注意的是,Pandas上的文档提到了get_valueset_value被废弃了,我认为这应该是iget_value

示例

为了使用几个索引器(包括直接调用get_valueset_value)来显示性能上的差异,我编写了以下脚本:

example.py

代码语言:javascript
运行
AI代码解释
复制
import timeit


def print_index_speed(stmnt_name, stmnt):
    """
    Repeatedly run the statement provided then repeat the process and take the
    minimum execution time.
    """
    setup = """
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(1000,2),columns = ['A','B'])
idx = 0
    """

    minimum_execution_time = min(
        timeit.Timer(stmnt, setup=setup).repeat(5, 10))

    print("{stmnt_name}: {time}".format(
        stmnt_name=stmnt_name,
        time=round(minimum_execution_time, 5)))

print_index_speed("set ix", "for i in range(1000): df.ix[i, 'A'] = 1")
print_index_speed("set at", "for i in range(1000): df.at[i, 'A'] = 2")
print_index_speed("set iat", "for i in range(1000): df.iat[i, idx] = 3")
print_index_speed("set loc", "for i in range(1000): df.loc[i, 'A'] = 4")
print_index_speed("set iloc", "for i in range(1000): df.iloc[i, idx] = 5")
print_index_speed(
    "set_value scalar",
    "for i in range(1000): df.set_value(i, idx, 6, True)")
print_index_speed(
    "set_value label",
    "for i in range(1000): df.set_value(i, 'A', 7, False)")

print_index_speed("get ix", "for i in range(1000): tmp = df.ix[i, 'A']")
print_index_speed("get at", "for i in range(1000): tmp = df.at[i, 'A']")
print_index_speed("get iat", "for i in range(1000): tmp = df.iat[i, idx]")
print_index_speed("get loc", "for i in range(1000): tmp = df.loc[i, 'A']")
print_index_speed("get iloc", "for i in range(1000): tmp = df.iloc[i, idx]")
print_index_speed(
    "get_value scalar",
    "for i in range(1000): tmp = df.get_value(i, idx, True)")
print_index_speed(
    "get_value label",
    "for i in range(1000): tmp = df.get_value(i, 'A', False)")

输出:

代码语言:javascript
运行
AI代码解释
复制
set ix: 0.9918
set at: 0.06801
set iat: 0.08606
set loc: 1.04173
set iloc: 1.0021
set_value: 0.0452
**set_value**: 0.03516
get ix: 0.04827
get at: 0.06889
get iat: 0.07813
get loc: 0.8966
get iloc: 0.87484
get_value: 0.04994
**get_value**: 0.03111
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28909034

复制
相关文章
从Mysql备份中恢复单个表
因为云平台的备份是把库中所有的表都打包成一个 .sql文件,然而这一个.sql文件大约有20G,现阶段的方法是把.sql文件source到数据库数据处理机器上,然后再根据需求提出需要的表。每次这个操作都需要大约2个多小时,太耗时。闲暇时间,Google到了一个大神写的几行代码,经过实验确实很好用。下面就分享出来,仅供参考。 思路(原谅我也理解了好一会儿): 主要使用sed命令来实现,加上-n,-e参数把打印的结果追加到一个文件中,就得到了想要的表的内容。 一般情况下我们使用sed打印指定行的内容是: [ro
行 者
2018/03/26
4.6K0
从Mysql备份中恢复单个表
python中csv的应用
dic = {'张三':123, '李四':456, '王二娃':789} csvFile3 = open('ming.csv','w') writer2 = csv.writer(csvFile3) for key in dic: writer2.writerow([key, dic[key]]) csvFile3.close()
py3study
2020/01/14
1.2K0
python中如何打开csv文件_python如何读取csv文件
python如何读取csv文件,我们这里需要用到python自带的csv模块,有了这个模块读取数据就变得非常容易了。
全栈程序员站长
2022/09/16
8K0
python中如何打开csv文件_python如何读取csv文件
Excel VBA解读(140): 从调用单元格中获取先前计算的值
如果有一个依赖于一些计算慢的资源的用户定义函数,可能希望该用户定义函数在大多数情况下只返回其占用的单元格中最后一次计算得到的值,并且只偶尔使用计算慢的资源。
fanjy
2019/07/19
6.9K0
python 从csv读数据到mysql
import csv import sys,os import MySQLdb def read_csv(filename): with open(filename) as f: f_csv = csv.reader(f) headers = next(f_csv) #数据格式[1111,22222,1111,1111,.....] #for row in f_csv: # Process row
py3study
2020/01/11
1.3K0
怎么用python打开csv文件_Python文本处理之csv-csv文件怎么打开[通俗易懂]
csv英文全称是Comma-Separated Value,字面翻译逗号分隔值,是一种常见的文本格式文档,可用Excel打开,也可用常见的文本编辑器打开。csv文件经常用于在电子表格软件和纯文本之间交互数据。
全栈程序员站长
2022/09/16
6.8K0
怎么用python打开csv文件_Python文本处理之csv-csv文件怎么打开[通俗易懂]
unity3d:csv读取数据,兼容单元格中包含逗号
由于excel导出csv不好转utf8,并且不能打开时跑程序,所以推荐个编辑器Ron‘s Editor csv编辑器https://www.ronsplace.eu/Products/RonsEditor/Download
立羽
2023/08/24
2470
unity3d:csv读取数据,兼容单元格中包含逗号
使用Python获取Excel文件中单元格公式的计算结果
假设有如下Excel文件,其中第二个WorkSheet中数据如下: 其中D列为公式,现在要求输出该列公式计算的数值结果,代码如下: 代码运行结果:
Python小屋屋主
2018/04/16
4.2K0
使用Python获取Excel文件中单元格公式的计算结果
用python的pandas打开csv文件_如何使用Pandas DataFrame打开CSV文件 – python[通俗易懂]
message : UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xa1 in position 0: invalid start byte.
全栈程序员站长
2022/09/16
11.9K0
python从SUMO中获取车辆平均行驶时间
在SUMO的帮助文档中的simulation output中有如下说明。SUMO提供用来记录车辆trip信息的文件。
钱塘小甲子
2019/01/29
3.4K0
python 从mysql获取变为redis获取
1.因采集是每分钟写入一次数据库,故redis每分钟读取一次数据库最新信息,读取脚本如下:
葫芦
2019/04/17
3.3K0
python 从mysql获取变为redis获取
【MindiaX实例】 PHP 在foreach 中获取JSON 单个数据
之前在开发MindiaX 主题的时候,遇到一个要解析远程JSON 文件的数据的问题。当时困扰我的是整型与数字字符串是否等价的问题。现在过年有时间,就记录回来。 PHP解析JSON 文件 这里的话就直接先讲结果,MindiaX 主题有一个定时自动更换背景的功能,调用的背景图是来自于http://dreamafar.qiniudn.com/destination.json,解析其中的几个名称/值组合成url。实现这部分的函数如下: // get remote img date from json functi
Jeff
2018/01/22
3.4K0
【MindiaX实例】 PHP 在foreach 中获取JSON 单个数据
用Python获取磁力种子
陈键冬,Python中文社区专栏作者,pyecharts开源项目核心开发者,github id:chenjiandongx
Python中文社区
2018/07/27
2.9K0
用Python获取磁力种子
用Python读取CSV文件的5种方式
一个股票的数据集,其实就是常见的表格数据。有股票代码,价格,日期,时间,价格变动和成交量。这个数据集其实就是一个表格数据,有自己的头部和身体。
全栈程序员站长
2022/09/16
10.6K0
用Python读取CSV文件的5种方式
用Python获取内网地址
import socket def get_host_ip(): with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
云深无际
2020/11/19
1.3K0
用Python获取内网地址
用Python获取磁力种子
现在我们使用迅雷等工具下载资源的时候,基本上都只需要一个叫做磁力链接的东西就可以了,非常方便。
小小科
2018/08/17
4K1
用Python获取磁力种子
Python使用csv模块读写csv文件
有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本形式存储表格数据。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
Python碎片公众号
2021/02/26
3.5K0
Python使用csv模块读写csv文件
csv模块-python
程序运行结果testqq.csv文件已经写入了aa bb cc内容。不过把之前文件里面的内容都清除掉了。
py3study
2020/01/14
1.3K0
Python3外置模块使用
(1)外置模块一览表 描述:Python外置模块可以说是Python的强大之处的存在,使得Python语言扩展性高,使用方法众多并且使用也非常简单,在我们日常的运维开发学习中尤为重要;
全栈工程师修炼指南
2020/10/23
4.7K0
Python3外置模块使用
Python3外置模块使用
(1)外置模块一览表 描述:Python外置模块可以说是Python的强大之处的存在,使得Python语言扩展性高,使用方法众多并且使用也非常简单,在我们日常的运维开发学习中尤为重要;
全栈工程师修炼指南
2022/09/28
3.5K0
Python3外置模块使用

相似问题

从.CSV文件中的单个单元格中获取多个值

25

用python从CSV文件中删除空白单元格

21

用Python计算CSV。从列表中获取数据

22

用python将单个.csv导入mysql

11

Python读取csv单个特定单元格

2377
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文