Dapatkan indeks kolom dari nama kolom dalam python panda

220

Di R ketika Anda perlu mengambil indeks kolom berdasarkan nama kolom yang bisa Anda lakukan

idx <- which(names(my_data)==my_colum_name)

Apakah ada cara untuk melakukan hal yang sama dengan kerangka data panda?

ak3nat0n
sumber

Jawaban:

360

Tentu, Anda bisa menggunakan .get_loc():

In [45]: df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

In [46]: df.columns
Out[46]: Index([apple, orange, pear], dtype=object)

In [47]: df.columns.get_loc("pear")
Out[47]: 2

walaupun jujur ​​saja saya tidak sering membutuhkan ini sendiri. Biasanya akses berdasarkan nama melakukan apa yang saya inginkan ( df["pear"],, df[["apple", "orange"]]atau mungkin df.columns.isin(["orange", "pear"])), meskipun saya pasti dapat melihat kasus di mana Anda ingin nomor indeks.

DSM
sumber
7
Nomor kolom berguna saat menggunakan .ilocoperator, di mana Anda hanya harus melewati bilangan bulat untuk baris dan kolom.
abe
4
Atau ketika menggunakan pustaka yang ingin DF dikonversi menjadi array numpy dan indeks kolom dengan fitur tertentu. Misalnya CatBoost ingin daftar indeks fitur kategorikal.
Tom Walker
1
Saya membutuhkan ini ketika menambahkan pemformatan bersyarat setelah membuat lembar kerja dengan ExcelWriter. Saya perlu merujuk ke kolom (dan sel) dengan koordinat Excel mereka.
Alejandro
Saya menggunakan ini saat membuat array subplot. Satu subplot dari data di setiap kolom.
David Collins
2
Saya menggunakannya ketika saya ingin insertkolom baru setelah kolom yang ada.
Amir A. Shabani
33

Berikut adalah solusi melalui pemahaman daftar. cols adalah daftar kolom untuk mendapatkan indeks untuk:

[df.columns.get_loc(c) for c in cols if c in df]
snovik
sumber
4
Karena colsmemiliki lebih sedikit elemen daripada df.columns, melakukan for c in cols if c in dfakan lebih cepat.
Eric O Lebigot
15

Solusi DSM berfungsi, tetapi jika Anda ingin yang setara langsung dengan yang dapat whichAnda lakukan(df.columns == name).nonzero()

Wes McKinney
sumber
10

Ketika Anda mungkin mencari untuk menemukan beberapa kolom yang cocok, solusi vektor menggunakan searchsortedmetode dapat digunakan. Dengan demikian, dengan dfsebagai kerangka data dan query_colssebagai nama kolom yang akan dicari, suatu implementasi akan -

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]

Contoh dijalankan -

In [162]: df
Out[162]: 
   apple  banana  pear  orange  peach
0      8       3     4       4      2
1      4       4     3       0      1
2      1       2     6       8      1

In [163]: column_index(df, ['peach', 'banana', 'apple'])
Out[163]: array([4, 1, 0])
Divakar
sumber
8

Jika Anda ingin nama kolom dari lokasi kolom (sebaliknya ke pertanyaan OP), Anda dapat menggunakan:

>>> df.columns.get_values()[location]

Menggunakan Contoh @DSM:

>>> df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

>>> df.columns

Index(['apple', 'orange', 'pear'], dtype='object')

>>> df.columns.get_values()[1]

'orange'

Cara lain:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
salin
sumber
2
Kenapa tidak adil df.columns[location]?
Roobie Nuby
1

bagaimana dengan ini:

df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})
out = np.argwhere(df.columns.isin(['apple', 'orange'])).ravel()
print(out)
[1 2]
Siraj S.
sumber