Lấy chỉ mục cột từ tên cột trong gấu trúc python


220

Trong R khi bạn cần truy xuất một chỉ mục cột dựa trên tên của cột bạn có thể làm

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

Có cách nào để làm điều tương tự với dataframes gấu trúc không?

Câu trả lời:


359

Chắc chắn, bạn có thể sử dụng .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

Mặc dù thành thật mà nói tôi không cần bản thân mình. Thông thường truy cập theo tên thực hiện những gì tôi muốn ( df["pear"], df[["apple", "orange"]]hoặc có thể df.columns.isin(["orange", "pear"])), mặc dù tôi chắc chắn có thể thấy các trường hợp bạn muốn số chỉ mục.


7
Số cột rất hữu ích khi sử dụng .iloctoán tử, trong đó bạn phải chỉ truyền số nguyên cho cả hàng và cột.
abe

4
Hoặc khi sử dụng các thư viện muốn DF chuyển đổi thành một mảng gọn gàng và các chỉ mục của các cột với các tính năng cụ thể. Ví dụ, CatBoost muốn có một danh sách các chỉ số của các tính năng phân loại.
Tom Walker

1
Tôi cần điều này khi thêm định dạng có điều kiện sau khi tạo bảng tính với ExcelWriter. Tôi cần tham khảo các cột (và ô) theo tọa độ Excel của chúng.
Alejandro

Tôi sử dụng điều này khi tạo ra một mảng các ô con. Một subplot từ dữ liệu trong mỗi cột.
David Collins

2
Tôi sử dụng nó khi tôi muốn insertmột cột mới sau một cột hiện có.
Amir A. Shabani

33

Đây là một giải pháp thông qua việc hiểu danh sách. cols là danh sách các cột để lấy chỉ mục cho:

[df.columns.get_loc(c) for c in cols if c in df]

4
colscó ít yếu tố hơn df.columns, làm for c in cols if c in dfsẽ nhanh hơn.
Eric O Lebigot

15

Giải pháp của DSM hoạt động, nhưng nếu bạn muốn tương đương trực tiếp với whichbạn có thể làm(df.columns == name).nonzero()


10

Khi bạn có thể đang tìm kiếm nhiều kết quả khớp cột, một giải pháp được vector hóa bằng searchsortedphương pháp có thể được sử dụng. Do đó, với dfkhung dữ liệu và query_colstên cột cần tìm kiếm, việc triển khai sẽ là -

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

Chạy mẫu -

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

Trong trường hợp bạn muốn tên cột từ vị trí cột (ngược lại với câu hỏi OP), bạn có thể sử dụng:

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

Sử dụng @DSM Ví dụ:

>>> 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'

Những cách khác:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 

2
Tại sao không chỉ df.columns[location]?
Roobie Nuby

1

Còn cái này thì sao:

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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.