DataFrame是一个表格型的数据结构,还有一组有序的列
DataFrame可以被看作是由Series组成的字典,并且共用一个索引
创建方式
pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
pd.DataFrame({'one':pd.Series([1,2,3,4],index=['a','b','c','d']),'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
csv文件读取与写入
df=pd.read_csv('test.csv') #把csv读出啦
df.to_csv('test2.csv') #存一个csv文件
DataFrame查看数据
查看数据常用属性及方法
index 获取行索引
T 转置
columns 获取列索引
values 获取值数组
describe 获取快速统计
DataFrame各列name属性:列名
rename(columns={...}) #如df.rename(columns={'close':'new_close','open':'new_open'}) #修改字段名
df.index.name='iid' #修改索引字段名
DataFrame索引和切片
DataFrame有行索引和列索引
通过标签获取:
df['close'] #取一列
df['close'][0] #取一个数字
df[['close','open']] #取两列,二维数组
df[0:10][['close','open']] #前十行的两列数据
DataFrame索引和切片
通过位置获取:
df.iloc[3] #取第3行数据
df.iloc[3,3] #取第3行的第3个数据
df.iloc[0:3,4:6] #取前3行的4,5列数据
df.iloc[1:5,:] #取前4行的所有数据
df.iloc[[1,2,4],[0,3]] #取第1,2,4行,第3列的数据
通过布尔值过滤:
df[df['close']>20] #取close列大于20的值的行
df[df['date'].isin(['2007/3/1','2007/3/4'])] #取2007.3.1到2007.3.4之间的行
df[df['id'].isin([1,3,5,7])] #取id列1,3,5,7行的数据
DataFrame数据对齐与缺失数据
DataFrame对象在运算时,同样会进行数据对齐,结果的行索引与列索引分别为两个操作数的行索引与列索引的并集
DataFrame处理缺失数据的方法
dropna(axis=0,how='any') #axis 默认0等于列,1等于行。how 默认any任意一个就删除,all全部都是nan就删除
fillna(),isnull(),notnull()
pandas其他常用方法(适用Series和DataFrame)
mean(axis=0,skipna=False)
sum(axis=1)
sort_index(axis,...,ascending) 按行或列索引排序 如 df.sort_index(ascending=True,axis=1),按列排序。与之相反df.sort_index(ascending=False,axis=0)
sort_values(by,axis,ascending) 按值排序 如df.sort_values('close',ascending=True) close列的数据从大到小排序
NumPy的通用函数同样适用于pandas
apply(func,axis=0) 将自定义函数应用在各行或者各列上,func可返回标量或者Series df2.apply(lambdax:x.sum()) 各列值之和。同df2.sum()
applymap(func) 将函数应用在DataFrame各个元素上 如df2.applymap(lambda x:x+1) 每一个数字都加1
map(func) 将函数应用在Series各个元素上
pandas层次化索引
层次化索引是pandas的一项重要功能,它使我们能够在一个轴上拥有多个索引级别
例:
data=pd.Series(np.random.rand(9),index=[['a','a','a','b','b','b','c','c','c'],[1,2,3,1,2,3,1,2,3]])
data['a'][1] #两层索引
pandas从文件读取
读取文件:从文件名,url,文件对象中加载数据
read_csv 默认分隔符为逗号
read_table 默认分隔符为\t
读取文件函数主要参数:
sep 指定分隔符,可以用正则表达式如:"\S+"header=None 指定文件无列名
names 指定列名
index_col 指定某列作为索引
skiprows 指定跳过某些行
na_values 指定某些字符串表示缺失值。默认就会将缺失值读取成NaN。所以可以不指定
parse_dates 指定某些列是否解析为日期,布尔值或列表
nrows 指定读取几行文件
chunksize 分块读取文件,指定块大小
例子:
df=pd.read_table('test.csv', #读取文件
sep=',', #以逗号分割,默认读取一整行
header=None, #没有列名
names=['id','date','open','close','high','low','valume','code'], #设置列名
skiprows=[1,2,3,4], #跳过0到3行
index_col='date', #date列设置为索引
parse_dates=['date']) #将date转换成时间对象。也可以写布尔值
type(df.index[0]) 查看类型
pandas写入到文件
写入到文件
to_csv
写入文件函数的主要参数
sep
na_sep 指定缺失值转换的字符串,默认为空字符串
header=False 不输出列名一行
index=False 不输出索引一行 #这样可以解决读取文件的时候多出一列,写入文件的时候过滤掉多出来的列
cols 指定输出的列、传入列表
其他文件类型:json/XML/HTML/数据库
pandas时间对象处理
时间序列类型:
时间戳: 特定时刻
固定时期:如2017年7月
时间间隔:起始时间~结束时间
Python标准库:datetime
date time datetime timedelta
strftime()
strptime()
第三方包: dateutil
dateutil.parser.parse("2017-01-01")。如没有日的话。就以现在的日期填充
成组处理日期:pandas
pd.to_datetime(['2017-01-01','2017-01-02'])
产生时间对象数组:date_range
start 开始时间
end 结束时间
periods 时间长度
freq 时间频率,默认为D,可选
H(our),W(eek),B(usiness),S(emi-)M(onth),M(min)T(es),S(econd),A(year)
pd.date_range("2017-01-01",'2017-02-01',frep='B') #1月1,到2月1的工作日。SM半月,Y年,Y-MON每周一
pd.date_range("2017-01-01",periods=100) #生成100天
df['2007'] #获取有2007的数据
df['2007-03-01':'2007-03-08'] #获取一段时间
时间序列就是以时间对象为索引的Series或DataFrame
datetime对象作为索引时是存储在DatetimeIndex对象的
时间序列特殊功能
传入年或年月作为切片方式
传入日期范围作为切片方式