DataFrame索引分为两种,一种真实序号索引,0代表第一行,1代表第二行,依此类推;另一种是标签索引,行序号或列序号可以用标签,比如说'a','b'等等;分别对应iloc与loc函数;iloc是一种真实序号索引;loc是一种标签索引;ix是混合标签;有一种情况在ix时需要特别注意,如果标签是整数序列,那么真实序号索引就用不了,只能当作loc来用;查看官方解释:However, when an axis is integer based, ONLY label based access and not positional access is supported. Thus, in such cases, it's usually better to be explicit and use ``.iloc`` or ``.loc``.
曾经犯的错:df.ix[0,'close']并没有取到第一行;后来对这种情况统一采用df['close].iloc[0]这种方式;先通过标签定位到列,然后用iloc定位到自己想要的真实序号的行;
来看一个案例:
代码如下:
import numpy as np
import pandas as pd
import math
data=[[0,0,0,2,2],
[0,0,0,3,3],
[0,0,0,1,1],
[1,1,1,0,0],
[2,2,2,0,0],
[5,5,5,0,0],
[1,1,1,0,0]]
#u, sigma, vt = np.linalg.svd(data)
df=pd.DataFrame(data)
print(df)
print(df.iloc[0])#定位到第一行
df=df.sort_values(0,ascending=False)#按列标签0排序;
#print(help(df.ix))
print(df)
print(df.ix[0])#定位到标签0
df.drop(0,axis=0,inplace=True)#删除指定0标签的行;所以0标签的行就不存在了
print(df)
print(df.ix[0])#不存在0标签,索引就会犯错
注意细节:1、drop第一个参数传入的是labels,官方解释如下 :
2、sort_values第一个参数传入的是labels;官方解释传入字符串,str or list of str;测试如下:
df=df.sort_values(0,ascending=False)
df.columns=list('abcde')
print(df)
df=df.sort_values(0,ascending=False)
print(df)
从这里可以证明传入必须是label,传入整数时,就将整数当作了label如同行索引一样的;官方帮助文档的解释是不足的,没有考虑传入整数的情况;
看代码:
print(type(df.columns[0]))# int
df.columns=list('abcde')
print(type(df.columns[0])) # str
df=pd.DataFrame(data)
print(type(df.columns[0]))
print(df)
print(df.iloc[0])
df=df.sort_values(0,ascending=False)
df.columns=list('01234')
print(type(df.columns[0]))
print(df)
df=df.sort_values(0,ascending=False)#这里就报错了,因为不存在整数0标签,只存在字符串‘0’标签;
print(df)
结论:sort_values传入是标签,和drop一样;