pandas 中的索引对象——为什么 pd.columns 返回索引而不是列表

2024-04-27

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


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

也就是说,您始终可以使用以下命令获取底层 numpy 数组df.columns.values,或者转换为 python 列表tolist()正如@Mitch 所示。

就为什么在裸数组上使用索引而言 -Index提供整个 pandas 中使用的额外功能/性能 - 其核心是基于哈希表的索引。

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

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 在评论中指出的那样,相同的哈希表结构还加速了许多其他操作,如合并、对齐、过滤和分组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas 中的索引对象——为什么 pd.columns 返回索引而不是列表 的相关文章

随机推荐