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