pandas中DataFrame定位數據單元格的方法集錦


問題來源:

我在做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'))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM