gpt4 book ai didi

python - pandas df.ix[number, column] 访问与 df[column].ix[number] 不同的标量类型

转载 作者:行者123 更新时间:2023-11-28 17:30:24 25 4
gpt4 key购买 nike

例如,

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'frames':np.arange(3), 'r':np.repeat(3, 3), \
'x':np.random.rand(3), 'y':list('041')}, index=list('abc'))

frames r x y
a 0 3 0.1241 '0'
b 1 3 0.4109 '4'
c 2 3 0.8714 '1'

然后 type(df1.ix[0, 'y']), type(df1['y'].ix[0]) 返回 (str, str) 符合预期。

但是,在使用 df1['y'] = df1['y'].astype(int) 将 'y' 列数据类型更改为整数后:

现在,type(df1.ix[0, 'y']), type(df1['y'].ix[0]) 返回 (numpy.float64, numpy .int64).

这对我来说似乎是非常不一致的行为。两种方法不应该返回相同的标量类型吗?我意识到我对 ix 的内部工作原理一无所知。有谁知道为什么或如何发生这种情况?

更重要的是,什么是访问标量最稳健的方式,以便它们保留其类型?

最佳答案

发生这种情况是因为 pandas Series 可能只有一种类型,当您执行 df1.ix[0,'y'] 访问第一行时y 列。行包含 float 变量,因此所有内容都转换为 np.float64。当您调用 df1['y'].ix[0] 时,您访问的列 y 具有 dtype np .int32 到第一个元素。一切都按预期工作。因此,对于您关于最稳健方式的问题,我认为第二种方法更可取,因为您始终知道列的 dtype 或者您可以轻松检查它,而对于 row 它可以转换自动。

顺便说一句,如果您按位置访问元素(当您使用列时),最好使用 iloc .来自 docs对于 ix:

.ix supports mixed integer and label based access. It is primarily label based, but will fall back to integer positional access unless the corresponding axis is of integer type. .ix is the most general and will support any of the inputs in .loc and .iloc. .ix also supports floating point label schemes. .ix is exceptionally useful when dealing with mixed positional and label based hierarchical indexes.

However, when an axis is integer based, ONLY label based access and not positional access is supported. Thus, in such cases, it’s usually better to be explicit and use .iloc or .loc

如果您只需要访问标量,您还应该考虑 iat方法。来自 docs :

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 the at and iat methods, which are implemented on all of the data structures.

基准测试:

In [129]: %timeit df1.y.ix[0]
10000 loops, best of 3: 30.2 us per loop

In [130]: %timeit df1.y.iloc[0]
10000 loops, best of 3: 24.6 us per loop

In [131]: %timeit df1.y.iat[0]
100000 loops, best of 3: 18.8 us per loop

关于python - pandas df.ix[number, column] 访问与 df[column].ix[number] 不同的标量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34756004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com