問題來源:
我在做WGS84經緯度轉換百度/高德經緯度時,遇到了一個警告。.ix 在Pandas 的 0.20.0 版本會被棄用。
1 i=0 2 while i<row_num: 3 test.ix[i,'bai_lng'],test.ix[i,'bai_lat'] =zb.wgs84_to_bd09(test.ix[i,'lng'],test.ix[i,'lat']) 4 i=i+1 5 test.head()
雖然目前還可以正常執行,為了應對以后python版本升級導致的問題,而且編程中混合索引應用還特別多。我想應該仔細研究一下pandas 所有的定位數據單元格的方法。
創建一個測試用dataframe,代碼如下:
arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])] df = pd.DataFrame(np.random.randn(8, 4), index=arrays) df.columns=['A','B','C','D'] df.index.names=['first','second'] df.head(10)
結論:
1.定位方式清單:
[ ] | 按np數組方式訪問一列數據 | df['A']或者 df.T['bar']['two] | df.T['bar']['two]比df.T['bar','two']更低效,因為在索引['two‘]之前創建了一個臨時數組 |
iloc[] | 基於整數索引,可一次訪問多行一行或一個標量 | df.iloc[:2, : ] | 選擇一行df.iloc[100] |
loc[] | 基於字符標簽索引,可一次訪問多行一行或一個標量 | df.loc['bar','two'] | 有一個意外好處,只要不做切片,可以用index的整數來索引具體的行 |
iat[] | 基於整數索引,一次訪問一個標量 | df.iat[1,2 ] | 速度比iloc快很多 |
at[] | 基於字符標簽索引,一次訪問一個標量 | df.at[('bar','two'), 'A'] | 速度比loc快很多 |
ix[] | 先用 loc 的方式索引,如果失敗再用 iloc 的方式索引 | test.ix[i,'lng'] | 支持整數,字符標簽混合索引 |
get_value() | 快速索引dataframe中單個值 | df.getvalue(('bar' , 'two'), 'B') | 速度最快 |
xs() | 多用於層次索引;不能精確定位到一個數據單元格;只能讀取數據,不能寫入數據 | df.xs(('baz','one'), level=('first','second')) |
TIPS:
標量:相對於矢量,只有大小沒有方向的數值。比如 39.343434
向量(矢量):既有方向,也有大小的一組數值。數據表里的一行數據,或者一列數據都可以是向量。比如 DataFrame中的一行或者一列
基於整數索引:.iloc, .iat 前面都有一個字母 i (integer positions),表示這是一個基於整數的索引。例如 df.iloc[0:100, : ]。特別提醒這里的整數都是基於當前數據集的位置。如果做了數據集篩選,位置值並不等於index值。
2 .ix 混合索引的替代方案
在官方文檔里找到了放棄ix索引的原因
既然以后不讓用ix了,那么混合索引怎么實現呢?
整數索引
df.iloc[ df.index.get_loc(('baz','two')), 3 ]=3.0
df.iloc[ row_num, df.columns.get_loc('C') ]=3.0
字符標簽索引
otherlist = df.index
df.loc[ otherlist[5] , 'A']=3.0
以下方法在一個DataFrame篩選后,索引已經不連續的情況下特別好用。
df.loc[ df.index[1] , 'A']=3.0
df.loc[ df['A'] == 39.1212121, df.columns[3]] =3.0
3.層次化索引 MultiIndex (hierarchical index)方式
df.loc[('baz', 'two'):('qux', 'one')]
df.xs(('baz','one'), level=('first','second'))