一. DataFrame的构造方式
1. 通过list或numpy数组构造DF
# -*- coding:utf-8 -*-
import pandas as pd
df = pd.DataFrame([data = ['a', 'b', 'c'], ['d', 'e', 'f'],['g', 'h', 'i']],
columns = ['field1', 'field2', 'field3'])
这是最简单的创建形式,传入的list一般是多维度的,且每一维度元素数目如果不一致,则DataFrame默认字符型缺失值为None,数值型缺失值为NaN(not a number);当list中传入的数据类型不一样时,遵循如下规则:
① list中如果有string类型则默认DataFrame该列为string类型
② list中如果是整数和小数,则小数对应的列是float类型
columns指定的是列名(也就是之前结构中的字段名)。columns参数传入的sequence的长度与多维数组中的列数等长,否则会报错。
其他创建DataFrame的参数还有:
① index(索引),他在官方文档中的定义为’Index to use for resulting frame. Will default to np.arange(m) ifno indexing‘,即默认是从0到m-1 (行数-1)。也可以自行设置一个序列用于作为索引,该序列中的元素数目必须与行数一致。
② dtype(类型),在官方文档中的解释为’Data type to force, otherwise infer‘,即用于强制转换数据类型,如果不指定则由Python自行推导。dtype的强制转换能力不是无限的,不可能将string转换为数值类。
2. 通过元组构造DF
形式与list构建DataFrame相近,只是将list换成了tuple类型。
3. 通过字典构造DF
# -*- coding:utf-8 -*-
import pandas as pd
df = pd.DataFrame({'goods':['coke cola', 'eggplant','condom'],
'quantity':[12,3,1],
'price':[20,12,80]})
简单的来说,利用Python的字典构造DataFrame就是讲DataFrame类中的data和columns参数合二为一,键值就是生成的DataFrame的列名。由于Python的字典是无序的,所以在不指定列的顺序的情况下,dict生成的DataFrame的列名顺序是随机的,如果列的顺序很重要,那么久再次对DataFrame中的columns参数进行设置,将字典中原有的键值进行排序。注意,此时上传的columns必须与dict中的键值一致,否则生成失败。
二. 生成数据的预览
1. shape属性
#-*- coding:utf-8 -*-
import pandas as pd
import MySQLdb as mdb
conn = mdb.connect(host = 'localhost',port=3306,user= 'root',passwd='*****',db = 'test')
df = pd.read_sql_table(table_name='table1',con=conn,index_col='col1',columns=['col1','col2'...])
df.shape
shape属性返回的是一个tuple,二维的DataFrame显示的是(x,y),其中x是行数,y是列数。Pandas的Dataframe的shape属性输出的不是索引,而是实实在在的几行几列,所以要格外注意。
2. columns属性
#-*- coding:utf-8 -*-
import pandas as pd
#-*- coding:utf-8 -*-
import pandas as pd
import MySQLdb as mdb
conn = mdb.connect(host = 'localhost',port=3306,user= 'root',passwd='*****',db = 'test')
df = pd.read_sql_table(table_name='table1',con=conn,index_col='col1',columns=['col1','col2'...])
df.columns
返回的形式是 Index(['column1','column2',...'colmun N'])这样的形式,显示的是各列的名字。
3.describe属性
#-*- coding:utf-8 -*-
import pandas as pd
import MySQLdb as mdb
conn = mdb.connect(host = 'localhost',port=3306,user= 'root',passwd='*****',db = 'test')
df = pd.read_sql_table(table_name='table1',con=conn,index_col='col1',columns=['col1','col2'...])
df.describe
describe()方法用于描述DataFrame,其中有个 include参数,写入的是字符串或者一个列表,里面的元素是要查看的数据类型。
4. name属性
dataframe的索引和列都是可以给定名字的,使用的是 index和 columns的 name属性,
5. 转换为Numpy数组
与Series一样,DataFrame的values属性能够将DataFrame转换为二维numpy数组的形式,
这个例子中,DataFrame的所有数据类型都是相同的,实际上,即使DataFrame数据类型不同,values属性也能将DataFrame转换为兼容所有数据类型的数组。
如在frame2中,各列的变量类型是不同的,
三. DataFrame运算
1. DataFrame之间的运算
运算时,行索引和列索引都要匹配上才能进行运算,否则得到的是缺失值,
但是在一些时候,运算产生的缺失值是不希望继续传播的,此时可以使用Pandas提供的一些方法,
以封装好的add方法进行演示,
对于上面两个DataFrame,使用普通的运算符进行运算,没有行列匹配的元素会得到NaN的值,
使用封装的add方法,对缺失数据时的值进行设置,
2. Series与DataFrame之间的运算
pandas基于numpy,所以dataframe和series之间运算时,会有和numpy数组一样的广播效应,
Series的索引会默认找到Dataframe中匹配的列,然后竖直方向传播。如果Series的索引在Dataframe的列索引中不存在,则Dataframe和Series会被重新索引,新的列索引是二者索引的并集,
运算后,匹配不上的结果会最终形成缺失值。
如果想让Series的索引匹配Dataframe的行索引,水平方向传播,那么就必须使用封装好的 add、sub、div和mul方法,并指定axis参数等于0。