項目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])
輸出為