Return index of first occurrence of maximum over requested axis. NA/null values are excluded. The axis to use. 0 or ‘index’ for row-wise, 1 or ‘columns’ for column-wise. Exclude NA/null values. If an entire row/column is NA, the result will be NA. Indexes of maxima along the specified axis. 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, idxmax
bạn cần idxmax
trả 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 ý: idxmax
trả về nhãn chỉ mục , không nhất thiết là thứ tự. Sau khi sử dụng reset_index
các nhãn chỉ mục cũng sẽ là thứ tự, nhưng vì idxmax
là nhãn trả về [không phải thứ tự], tốt hơn là luôn sử dụng idxmax
kết hợp với df.loc
chứ 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:
- 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]
]
- 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ẻ