问题来源:
我在做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'))