繁体   English   中英

熊猫中的索引对象-为什么pd.columns返回索引而不是列表

[英]Index objects in pandas--why pd.columns returns index rather than list

从R背景来看,我发现熊猫中Index对象的使用(很高)有点令人不安。 例如,如果train是一个熊猫DataFrame,为什么train.columns应该返回一个Index而不是一个列表有一些特殊的原因吗? 如果它是Index对象,还可以达到什么目的? 根据pandas.Index的定义,它是存储所有pandas对象的轴标签的基本对象。 虽然train.index.values确实返回行标签(axis = 0),但如何从pandas.index获取列标签或列名称? 在这个问题上,与前面的问题不同,我想到了一个具体的例子。

pd.Index是列名称的类似数组的容器,因此从某种意义上讲,询问如何从索引中获取标签没有意​​义,因为索引标签。

就是说,您始终可以使用df.columns.values获取基础的numpy数组,或者使用tolist()转换为python列表。

关于为什么在裸数组上使用索引的原因- Index提供了在整个熊猫中使用的额外功能/性能-其核心是基于哈希表的索引。

例如,考虑以下框架/列。

df = pd.DataFrame(np.random.randn(10, 10),
                  columns=list('abcdefghkm'))

cols = df.columns

cols
Out[16]: Index(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm'], dtype='object')

现在说您想从框架中选择列'h' 使用列的列表或数组版本,您可以遍历列以查找'h'的位置,该位置在列数中为O(n) ,如下所示:

for i, col in enumerate(cols):
    if col == 'h':   
        found_loc = i
        break

found_loc
Out[18]: 7

df.values[:, found_loc]
Out[19]: 
array([-0.62916208,  2.04403495,  0.29498066,  1.07939374, -1.49619915,
       -0.54592646, -1.04382192, -0.45934113, -1.02935858,  1.62439231])

df['h']
Out[20]: 
0   -0.629162
1    2.044035
2    0.294981
3    1.079394
4   -1.496199
5   -0.545926
6   -1.043822
7   -0.459341
8   -1.029359
9    1.624392
Name: h, dtype: float64

通过使用Index ,pandas构造了列值的哈希表,因此查找'h'的位置是摊销的O(1)操作,通常快得多,尤其是在列数很大的情况下。

df.columns.get_loc('h')
Out[21]: 7

这个示例仅选择一个列,但是正如@ayhan在注释中指出的那样,这种相同的哈希表结构还加快了许多其他操作,如合并,对齐,过滤和分组。

pandas.Index的文档中

实现一个有序,可切片集合的不可变ndarray。 所有熊猫对象的基本对象存储轴标签

显然,使用常规列表作为DataFrame的索引可能会导致无法排序或无法哈希的对象出现问题-由于哈希表支持哈希表,因此在常规Python中为什么列表不能成为字典键的原则相同。

同时,与例如NumPy具有的隐式整数索引相比,显式的Index对象允许我们使用不同的类型作为Index,并执行快速查找。

如果要检索列名列表,则Index对象具有tolist方法。

>>> df.columns.tolist()
['a', 'b', 'c']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM