Hướng dẫn dùng pandas idxmax python

DataFrame.idxmax(axis=0, skipna=True)[source]

Return index of first occurrence of maximum over requested axis.

NA/null values are excluded.

Parametersaxis{0 or ‘index’, 1 or ‘columns’}, default 0

The axis to use. 0 or ‘index’ for row-wise, 1 or ‘columns’ for column-wise.

skipnabool, default True

Exclude NA/null values. If an entire row/column is NA, the result will be NA.

ReturnsSeries

Indexes of maxima along the specified axis.

RaisesValueError
  • If the row/column is empty

Notes

This method is the DataFrame version of ndarray.argmax.

Examples

Consider a dataset containing food consumption in Argentina.

>>> df = pd.DataFrame({'consumption': [10.51, 103.11, 55.48],
...                    'co2_emissions': [37.2, 19.66, 1712]},
...                    index=['Pork', 'Wheat Products', 'Beef'])

>>> df
                consumption  co2_emissions
Pork                  10.51         37.20
Wheat Products       103.11         19.66
Beef                  55.48       1712.00

By default, it returns the index for the maximum value in each column.

>>> df.idxmax()
consumption     Wheat Products
co2_emissions             Beef
dtype: object

To return the index for the maximum value in each row, use axis="columns".

>>> df.idxmax(axis="columns")
Pork              co2_emissions
Wheat Products     consumption
Beef              co2_emissions
dtype: object

Tôi có một khung dữ liệu được tạo qua df.pivot:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908140300    NaN    480
               20150908140600    NaN    120
               20150908143000  10743   8803
C              20150908140100    NaN   1715
               20150908140200    NaN   1062
               20150908141000    NaN    145
               20150908141500    418    NaN
               20150908141800    NaN    450
               20150908142900   1973   1499
               20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

Tôi muốn lọc và trả về một hàng cho mỗi 'F_TYPE' chỉ trả về hàng có 'to_date' Tối đa. Tôi muốn trả lại khung dữ liệu sau:

type                             start  end
F_Type         to_date                     
A              20150908143000    345    316
B              20150908143000  10743   8803
C              20150908143000  19522  16659
D              20150908143000    433     65
E              20150908143000   7290   7375
F              20150908143000      0      0
G              20150908143000   1796    340

Cảm ơn..

  • python
  • pandas

26 hữu ích 1 bình luận 38k xem chia sẻ

answer

61

Hướng dẫn dùng pandas idxmax python

Một cách tiếp cận tiêu chuẩn là sử dụng groupby(keys)[column].idxmax(). Tuy nhiên, để chọn các hàng mong muốn bằng cách sử dụng, idxmaxbạn cần idxmaxtrả về các giá trị chỉ mục duy nhất. Một cách để có được một chỉ mục duy nhất là gọi reset_index.

Khi bạn nhận được các giá trị chỉ mục từ đó, groupby(keys)[column].idxmax()bạn có thể chọn toàn bộ hàng bằng cách sử dụng df.loc:

In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]: 
                       start    end
F_Type to_date                     
A      20150908143000    345    316
B      20150908143000  10743   8803
C      20150908143000  19522  16659
D      20150908143000    433     65
E      20150908143000   7290   7375
F      20150908143000      0      0
G      20150908143000   1796    340

Lưu ý: idxmaxtrả về nhãn chỉ mục , không nhất thiết là thứ tự. Sau khi sử dụng reset_indexcác nhãn chỉ mục cũng sẽ là thứ tự, nhưng vì idxmaxlà nhãn trả về (không phải thứ tự), tốt hơn là luôn sử dụng idxmaxkết hợp với df.locchứ không phải df.iloc(như tôi đã làm trong bài đăng này ban đầu.)

61 hữu ích 1 bình luận chia sẻ

answer

4

Hướng dẫn dùng pandas idxmax python

Các cách khác để làm điều đó như sau:

  1. Nếu bạn chỉ muốn một hàng tối đa cho mỗi nhóm.
(
    df
    .groupby(level=0)
    .apply(lambda group: group.nlargest(1, columns='to_date'))
    .reset_index(level=-1, drop=True)
)
  1. Nếu bạn muốn nhận tất cả các hàng bằng giá trị tối đa cho mỗi nhóm.
(
    df
    .groupby(level=0)
    .apply(lambda group: group.loc[group['to_date'] == group['to_date'].max()])
    .reset_index(level=-1, drop=True)
)

4 hữu ích 2 bình luận chia sẻ

Hướng dẫn dùng pandas idxmax python

Đăng nhập để trả lời câu hỏi

Có thể bạn quan tâm

Hướng dẫn dùng pandas idxmax python