天天看點

pandas loc, iloc, ix, at, iat用法

項目github位址:bitcarmanlee easy-algorithm-interview-and-practice

歡迎大家star,留言,一起學習進步

1.loc用法

loc是基于行的index,可以選擇特定的行,同時還可以根據列名稱標明指定列。

iloc是基于行/列的位置(position)來進行選擇

def select_test():
    a = [i for i in range(10)]
    b = [2*x + 0.1 for x in a]
    data = {"x": a, "y": b}
    tmp = pd.DataFrame(data, index=["r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10"])
    print(tmp.index)
    print(tmp.columns)
    print()
    return tmp
           

方法的輸出結果為

Index(['r1', 'r2', 'r3', 'r4', 'r5', 'r6', 'r7', 'r8', 'r9', 'r10'], dtype='object')
Index(['x', 'y'], dtype='object')
           

用loc方法選擇第一行

tmp = select_test()
print(tmp.loc["r1"])
           

輸出結果

x    0.0
y    0.1
Name: r1, dtype: float64
           

用loc方法選擇前三行,并隻選擇x列:

print(tmp.loc[["r1", "r2", "r3"], "x"])
           
r1    0
r2    1
r3    2
Name: x, dtype: int64
           

如果用loc[1]方法,會報錯

TypeError: cannot do label indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [1] of <class 'int'>
           

2.iloc用法

選擇前五行

print(tmp.iloc[0:5])
           
x    y
r1  0  0.1
r2  1  2.1
r3  2  4.1
r4  3  6.1
r5  4  8.1
           

選擇前五行的第二列(第一列的索引為0):

print(tmp.iloc[0:5, 1:2])
           
y
r1  0.1
r2  2.1
r3  4.1
r4  6.1
r5  8.1
           
print(tmp.iloc[0:5, "x"])
           

上面這行代碼會報錯:

ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types
           

原因很簡單,iloc隻能用行列的起始位置進行選擇,不能使用行列名。

3.ix

ix在舊版本中,是loc與iloc的混合體,既支援位置選擇也支援列名選擇。

在新版本中,該方法已經被廢棄。個人覺得,也應該被廢棄。API太靈活帶來的必然後果就是代碼不規範,可讀性差。

4.索引快速選擇

還有快速選擇行/列的方式

print(tmp[0:5])
print(tmp[['x', 'y']])
           
x    y
r1  0  0.1
r2  1  2.1
r3  2  4.1
r4  3  6.1
r5  4  8.1
     x     y
r1   0   0.1
r2   1   2.1
r3   2   4.1
r4   3   6.1
r5   4   8.1
r6   5  10.1
r7   6  12.1
r8   7  14.1
r9   8  16.1
r10  9  18.1
           

其中,第一行代碼選擇前5行資料,第二行代碼選擇x,y兩列資料。

5.at/iat方法

at可以根據行index及列名,快速選擇dataframe中的某個元素:

print(tmp.at["r3", "x"])
           

輸出為

2
           

如果使用如下代碼會報錯

print(tmp.at[3, "x"])
           
ValueError: At based indexing on an non-integer index can only have non-integer indexers
           

與iloc類似,iat也是通過位置(position)定位元素

print(tmp.iat[0, 0])
           

輸出為