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?

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.


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]

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()


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])

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.) 

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]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.