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'))
posted @ 2017-10-19 17:51  ted_castle  阅读(10250)  评论(0编辑  收藏  举报