[英]How to specify a columns dtype by its index rather than its name in pandas pd.read_excel
[英]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.