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

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

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ẻ

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

Có thể bạn quan tâm

Chủ đề