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.