1. 程式人生 > >Python文摘:argmin/argmax 與 idxmin/idxmax

Python文摘:argmin/argmax 與 idxmin/idxmax

原文地址:https://www.jianshu.com/p/f21f01a92521

 

1. 緣起

pandas 裡面的 idxmin 和 argmin 看起來比較陌生,便本著每日一 Py 的原則想搞搞清楚。idxmax 和 argmax 類似,不過今天題圖的美女胸比較 mini,便只看 min 吧。max 函式同理。

2. Series 分析

2.1 Series.argmin 分析

先從 Series 看起。從 Series 文件裡面可以看出,Series 的 argmin 等於 numpy 的 ndarray.argmin 的 Series 版

,作用是用來找出第一個最小值的 index。既然返回的是 Series 的 index,那資料型別應該也是匹配的。

測試程式碼如下

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10).reshape(2,5),columns=list('abcde')) print(df) 
a         b         c         d         e 0 0.045384 0.484123 1.112115 0.037907 0.152338 1 0.151654 -0.056504 1.918992 1.057143 0.081632 

分別測試一下列 Series 和行 Series。

a = df.a
print('a is')
print(a)
print('argmin of column a is %s.' % a.argmin()) print('*'*20) A = df.loc[1] print('A is ') print(A) print('argmin of row2 is %s.' % A.argmin()) 
a is
0    0.045384
1    0.151654
Name: a, dtype: float64 argmin of column a is 0. ******************** A is a 0.151654 b -0.056504 c 1.918992 d 1.057143 e 0.081632 Name: 1, dtype: float64 argmin of row2 is b. 

與我們預想的一致,返回了 index。

2.2 Series.idxmin 分析

本來尋思也用類似的方法看看 idxmin,結果在文件頁赫然發現和 argmin 完全一樣的介紹

This method is the Series version of ndarray.argmin.

我有點蒙,這不完全一樣的功能麼,為什麼又兩個方法?琢磨了一下,貌似可以嘗試看看原始碼。這就是開源的好處吧。

結果思路對了就省事兒多了。argmin 和 idxmin 的原始碼連結都指向一個連結,idxmin 的原始碼。而且在原始碼後面明明確確的寫著:

# ndarray compat
argmin = idxmin
argmax = idxmax

吼吼,別名而已!

3. DataFrame.idxmin 分析

DataFrame 沒有 argmin 方法,只有 idxmin。我琢磨著之所以 Series 有兩個一樣的函式,應該是作者為了和 numpy 保持相容吧,而他自己更傾向於用 idxmin。

既然用 pandas,還是保持 pandas 一致吧,以後都用 idxmin。這個函式可以指定不同的軸來返回不同 Series 的最小值,程式碼如下

print(df.idxmin(axis=0))
print('*'*30)
print(df.idxmin(axis=1))
a    0
b    1
c    0
d    0
e    1
dtype: int64
******************************
0    d
1    b
dtype: object

4. 總結

今天討論了一下 pandas 裡面的 argmin / idxmin 函式。對於 Series 來說,這兩個其實是一個函式的兩個不同名字,從原始碼裡面可以看出來;對於 DataFrame,則乾脆沒有 argmin,只有 idxmin。

所以為了保持一致性,以後可以都統一用 idxmin。這個函式可以返回當前物件第一個出現最小值的索引。



作者:張利東
連結:https://www.jianshu.com/p/f21f01a92521
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。