簡體   English   中英

當列名是整數時,按列號索引 Pandas DataFrame

[英]Index pandas DataFrame by column numbers, when column names are integers

我試圖只保留 DataFrame 的某些列,當列名是字符串時它工作正常:

In [2]: import numpy as np

In [3]: import pandas as pd

In [4]: a = np.arange(35).reshape(5,7)

In [5]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], ['a', 'b', 'c', 'd', 'e', 'f', 'g'])

In [6]: df
Out[6]: 
    a   b   c   d   e   f   g
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [7]: df[[1,3]] #No problem
Out[7]: 
    b   d
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

但是,當列名是整數時,我收到一個關鍵錯誤:

In [8]: df = pd.DataFrame(a, ['x', 'y', 'u', 'z', 'w'], range(10, 17))

In [9]: df
Out[9]: 
   10  11  12  13  14  15  16
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

[5 rows x 7 columns]

In [10]: df[[1,3]]

結果是:

KeyError: '[1 3] not in index'

我可以理解為什么 Pandas 不允許這樣做 -> 以避免在按列名和列號進行索引之間混淆。 但是,有沒有辦法告訴熊貓我想按列號索引? 當然,一種解決方案是將列名轉換為字符串,但我想知道是否有更好的解決方案。

這正是iloc的目的,見這里

In [37]: df
Out[37]: 
   10  11  12  13  14  15  16
x   0   1   2   3   4   5   6
y   7   8   9  10  11  12  13
u  14  15  16  17  18  19  20
z  21  22  23  24  25  26  27
w  28  29  30  31  32  33  34

In [38]: df.iloc[:,[1,3]]
Out[38]: 
   11  13
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

只需將標題從整數轉換為字符串。 在使用 Pandas 數據集時,這應該幾乎總是作為最佳實踐來完成以避免意外

df.columns = df.columns.map(str)

這當然是感覺像錯誤但實際上是設計決策的事情之一(我認為)。

一些解決選項:

用它們的位置作為名稱重命名列:

 df.columns = arange(0,len(df.columns))

另一種方法是從df.columns獲取名稱:

print df[ df.columns[[1,3]] ]
   11  13
x   1   3
y   8  10
u  15  17
z  22  24
w  29  31

我懷疑這是最吸引人的,因為它只需要添加一點代碼而不更改任何列名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM