import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
#数据
data = [['a',0,1],
['b',2,3],
['c',4,5]]
#数据框
data = pd.DataFrame(data,index=['lu','li','meng'],columns=['m','mm','mmm'])
#iloc方法
print(data.iloc[0,2])#第1行第3个元素
# print(data.iloc['0','m'])#报错,iloc方法不能使用字符索引,只能使用位置索引
#loc方法
# print(data.loc[0,0])#错误,loc行和列不能用位置索引
print(data.loc['lu','mm'])#用名字索引,相当于第1行第二个元素
# print(data.ix[0,1])#报错,可能现在的DataFrame不支持ix
通过自己测试,很明显,pandas中 iloc方法只能用位置索引来获取数据,不可以使用字符索引,
而,loc是使用的index和columns名称索引。ix索引方式测试会报错,可能DataFrame不支持ix索引了吧,不太建议使用ix索引。
-------------------------------------------------------------------------------------------
1、例子
取DataFrame的部分数据,或者修改部分数据是非常非常常见的操作,但是实际应用中,到底使用ix方法,还是iloc方法,还是loc方法,还需要讨论。请看下面的实验:
import pandas as pd
data = [['自有房',40,50000],
['无自有房',22,13000],
['自有房',30,30000]]
data = pd.DataFrame(data,index=['lc','cc','lbb'],columns=['house','age','income'])
df = data.ix[0,1]
df = data.iloc[0,1]
df = data.loc['lc','age']
# df = data.loc[0,'age'] #报错
# df = data.iloc[0,'age'] #报错
df = data.ix[0,'age']
df = data.ix[data['age']>=30]
df = data.ix[data['age']>=30,0]
# df = data.iloc[data['age']>=30,0] #报错
# df = data.iloc[data['age']>=30] #报错
df = data.loc[data['age']>=30]
df = data.loc[data['age']>=30,'age']
df = data[data['age']>=30]
# df = data[data['age']>=30,'age'] #报错
df = data[data['age']>=30]['age']
print(df)
data.ix[0,1] = data.ix[0,1]+5
data.iloc[0,1] = data.iloc[0,1]+5
data.loc['lc','age'] = data.loc['lc','age']+5
data.ix[0,'age'] = data.ix[0,1]+5
# data.iloc[0,'age'] = data.iloc[0,1]+5 #报错
data.loc[0,'age'] = data.loc['lc','age']+5 #会新增一行索引为0的行,且age为lc行age+5,但另外两列为空值
print(data)
2、总结
通过实验结果其实就可以看出来了,结论如下:
1、ix可以接受 位置索引和name索引,且行和列不必都是位置或name,但是Pycharm有提示过我ix方法要被抛弃了,最好不用;
2、loc是基于 name索引 的,如果你行或列其中一个用了位置索引,它会报index错误的,但是如果你是赋值给它,它会默认新增一行一列的;
3、iloc是基于 位置索引的,如果你行或列其中一个用了name索引,也是会报index错误的,而且赋值也不行;
4、这三种方法 都可以添加条件进行过滤。
综上所述,三种方法的功能都是取数,且都具有过滤功能,只是ix可以接受位置和name两种形式的索引,loc只接受name形式,而iloc只接受位置索引。
————————————————