簡體   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