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

时间:2017-09-14 14:06:11

标签: python pandas

来自R背景,我发现大熊猫中Index对象的(非常高)使用有点令人不安。例如,如果train是pandas DataFrame,为什么train.columns应该返回Index而不是列表?如果它是Index对象,还会有什么用途呢?根据{{​​1}}的定义,它是存储所有pandas对象的轴标签的基本对象。虽然pandas.Index确实返回行标签(axis = 0),但如何从train.index.values获取列标签或列名称?在这个问题中,与之前的问题不同,我有一个具体的例子。

2 个答案:

答案 0 :(得分:3)

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

也就是说,您总是可以使用df.columns.values获取基础numpy数组,或者转换为tolist()的python列表,如@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注释时,这个相同的哈希表结构也加速了许多其他操作,如合并,对齐,过滤和分组。

答案 1 :(得分:2)

来自pandas.Index

的文档
  

不可变的ndarray实现有序的可切片集。存储所有pandas对象的轴标签的基本对象

将常规列表作为DataFrame的索引可能会导致无法解决或不可用的对象出现问题 - 显然 - 由于它是由哈希表支持的,因此适用于常规Python中lists can't be dictionary keys的原因相同的原则。

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

如果要检索列名列表,则Index对象具有>>> df.columns.tolist() ['a', 'b', 'c'] 方法。

function send2dropbox(file) {
  var dropboxTOKEN = 'XXXxxx';

  var path = '/somePath/' + file.getName();
  var dropboxurl = 'https://api.dropboxapi.com/2/files/save_url';
  var fileurl = 'https://drive.google.com/uc?export=download&id=' + file.getId(); 

  var headers = {
    'Authorization': 'Bearer ' + dropboxTOKEN,
     'Content-Type': 'application/json'
  };
  var payload = {
    "path": path,
    "url": fileurl
  }
  var options = {      
    method: 'POST',
    headers: headers,
    payload: JSON.stringify(payload)    
  }; 

  var response = UrlFetchApp.fetch(dropboxurl, options);  
  return response;  
}