DataFrame类型由共用相同索引的一组列组成,就是最熟悉的表格类型。 纵向的索引叫做index(axis=0),横向的叫做columns(axis=1),既有行索引,也有列索引。 DataFrame常用于表达二维数据,但可以表达多维数据。 可以由如下类型创建: ①二维ndarray对象。 ②由一维ndarray,列表,字典,元祖或series构成的字典 ③series类型 ④其他Dataframe类型
①二维ndarray对象创建 2行5列的np,DataFrame自动添加了行索引和列索引。 ②一维ndarray对象字典创建 不知道为什么,one的值变成了浮点数。 再看看dt的情况: dt是字典,通过DataFrame类型创建好像变成了一个“漂亮的表格”。 通过字典方式创建,key成为了列索引,行索引是字典中指定的index。 也可以在创建的时候,显示指定index和columns,注意这种指定不是在随意起名,而是要与字典的key-values对应。 字典dt中并没有’three’这个key,所以生成的DataFrame‘three’列也是NaN。 ####总结:我感觉字典的表现出的格式和DataFrame格式是向右旋转了90度,然后再把表翻过来,所以对于一个表格外观,两者要“倒过来构思”。 假设DataFrame要形成这样的表格结构,那么‘城市’,‘环比’,‘同比’,‘定基’就要作为字典的key,对应的部分作为values。
di={'城市':['北京','上海','广州','深圳','沈阳'],'环比':[101.5,101.2,101.3,102.0,100.1],'同比':[120.7,127.3,119.4,140.9,101.4],'定基':[121.4,127.8,120.0,145.5,101.6]} df=pd.DataFrame(di)为什么df的格式和预想的不同呢,列的顺序乱了,这是因为字典类型di生成的时候,字典元素是无序的。 我们其实最关心的是df数据的values部分,使用df.values就能看见一个array类型 ####总结:DataFrame的本质就是索引+数据,也即索引+array,二维带‘标签’的数组。 在建立好DataFrame类型之后,如何获取数据? 给出列索引,获取一列 这样的一列就相当于一个series,它有名字,名字就是其对应的列索引。 但是DataFrame对象是没有name属性的 如何获取一行呢?直接用df[1]是错误滴! 必须用df.ix[]形式,结果用教学视频方式: .ix方式虽然也输出了一行,但是反对这种用法,请用.loc或者.iloc 想要获取多行,多列:
#####总结:获取一列可以直接用df[],获取一行要用df.loc[],获取多行多列要用两个[[,]]形式,如果要通过行和列来精确某一个位置的数据,可以使用df[列索引][行索引],并且不能把顺序搞反。 #####对于行数据,也可以使用数字切片方法: #####事实上,.loc和.iloc都可以用来行和列的切片操作。 虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,我们推荐使用经过优化的pandas数据访问方式: .at, .iat, .loc, .iloc loc是指location的意思,iloc中的i是指integer。这两者的原意是标签定位,区别如下:
loc works on labels in the index. iloc works on the positions in the index (so it only takes integers). 也就是说,loc是能够工作在自定义的index标签,而iloc是工作在默认的index标签数字。 第一个区别示例: 对于redf,自定义了行索引,此时.ioc和.iloc的结果: 可见.ioc以用户自定义的行标签为参考,.iloc依然使用系统默认。
第二个区别的示例,loc[]是包括了]最右边,而iloc跟python设定相同,不包括]最右边。 在行索引上使用loc或iloc效果不一样: 可见传统df[0:3]与df.iloc[0:3]相同。
如果切出城市和环比两个列,loc第一个参数说明取所有行: 如果想要连续切片城市,定基,环比 3个列,因为自定义了行标签,无法使用loc数字切片,可以用.iloc,或者老老实实的写完3个行标签。
df.loc[:,1:3] #错误写法,行标签已经自定义了 df.iloc[:,1:4] #正确写法 df.loc[:,['城市':'环比']] #错误写法 df.loc[:,'城市':'环比'] #正确写法,切片不加[]符号 df.loc[:,['城市','定基','环比']] #正确写法,多个标签成为列表,要加[] df[['城市','定基','环比']] #正确写法总结:对任意行列切片都可以使用.loc和.iloc,但是要注意写法细节。.iloc缺点是要去数行列,纯数字也不直观;.loc使用用户自定义标签,非常直观,自己以后用这个,要注意包涵关系和切片不加[]符号。
