Tìm tên cột có giá trị lớn nhất cho mỗi hàng


122

Tôi có một DataFrame như thế này:

In [7]:
frame.head()
Out[7]:
Communications and Search   Business    General Lifestyle
0   0.745763    0.050847    0.118644    0.084746
0   0.333333    0.000000    0.583333    0.083333
0   0.617021    0.042553    0.297872    0.042553
0   0.435897    0.000000    0.410256    0.153846
0   0.358974    0.076923    0.410256    0.153846

Ở đây, tôi muốn hỏi làm thế nào để lấy tên cột có giá trị lớn nhất cho mỗi hàng, đầu ra mong muốn như thế này:

In [7]:
    frame.head()
    Out[7]:
    Communications and Search   Business    General Lifestyle   Max
    0   0.745763    0.050847    0.118644    0.084746           Communications 
    0   0.333333    0.000000    0.583333    0.083333           Business  
    0   0.617021    0.042553    0.297872    0.042553           Communications 
    0   0.435897    0.000000    0.410256    0.153846           Communications 
    0   0.358974    0.076923    0.410256    0.153846           Business 

Câu trả lời:


164

Bạn có thể sử dụng idxmaxwith axis=1để tìm cột có giá trị lớn nhất trên mỗi hàng:

>>> df.idxmax(axis=1)
0    Communications
1          Business
2    Communications
3    Communications
4          Business
dtype: object

Để tạo cột mới 'Tối đa', hãy sử dụng df['Max'] = df.idxmax(axis=1).

Để tìm chỉ mục hàng mà tại đó giá trị lớn nhất xuất hiện trong mỗi cột, hãy sử dụng df.idxmax()(hoặc tương đương df.idxmax(axis=0)).


@SushantKulkarni Bạn đã làm cách nào để có được 3 xác suất cao nhất thay vì top 1?
Stergios

# Computing xác suất cho tất cả accountsproba = lr.predict_proba (tfidf) MLR_y_p = pd.DataFrame (proba, cột = np.unique (y), index = df.Key.tolist ())
Sushant Kulkarni

25

Và nếu bạn muốn tạo một cột chứa tên của cột có giá trị lớn nhất nhưng chỉ xem xét một tập hợp con của các cột thì bạn sử dụng một biến thể của câu trả lời @ ajcr:

df['Max'] = df[['Communications','Business']].idxmax(axis=1)

5
Nếu bạn muốn loại trừ tất cả các cột ngoại trừ một nhóm nhỏdf['Max'] = df[df.columns.difference(['Foo','Bar'])].idxmax(axis=1)
floatingpurr

9

Bạn có thể applytrên khung dữ liệu và nhận argmax()từng hàng quaaxis=1

In [144]: df.apply(lambda x: x.argmax(), axis=1)
Out[144]:
0    Communications
1          Business
2    Communications
3    Communications
4          Business
dtype: object

Đây là điểm chuẩn để so sánh mức độ chậm của applyphương pháp idxmax()đối vớilen(df) ~ 20K

In [146]: %timeit df.apply(lambda x: x.argmax(), axis=1)
1 loops, best of 3: 479 ms per loop

In [147]: %timeit df.idxmax(axis=1)
10 loops, best of 3: 47.3 ms per loop
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.