pandas简介
1、pandas是一个强大的Python数据分析的工具包。
2、pandas是基于NumPy构建的。
3、pandas的主要功能
- 具备对其功能的数据结构DataFrame、Series
- 集成时间序列功能
- 提供丰富的数学运算和操作
- 灵活处理缺失数据
4、安装方法:pip install pandas
5、引用方法:import pandas as pd
Pandas之Series
series是一种一维数据结构,每一个元素都带有一个索引,与一维数组的含义相似,其中索引可以为数字或字符串。
创建
import pandas as pd import numpy as np pd.Series([1, 2, 3, 4]) pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) pd.Series({'a': 1, 'b': 2}) pd.Series(np.arange(5))
Series常用特性
In [8]: sr = pd.Series([1, 2, 3, 4]) In [9]: sr*2 Out[9]: 0 2 1 4 2 6 3 8 dtype: int64 In [10]: sr[sr>1] #布尔运算 Out[10]: 1 2 2 3 3 4 dtype: int64 In [11]: 3 in sr Out[11]: True In [12]: sr.sum() #求和 Out[12]: 10 In [13]: sr.mean() #求平均数 Out[13]: 2.5 In [14]: sr.index Out[14]: RangeIndex(start=0, stop=4, step=1) In [15]: sr.index=['a','b','c','d'] In [16]: sr Out[16]: a 1 b 2 c 3 d 4 dtype: int64 In [17]: sr.index #索引 Out[17]: Index(['a', 'b', 'c', 'd'], dtype='object') In [18]: sr.values #值 Out[18]: array([1, 2, 3, 4], dtype=int64) In [19]: sr.head() #前5列 Out[19]: a 1 b 2 c 3 d 4 dtype: int64
标签索引
loc——通过行标签索引行数据
iloc——通过行号索引行数据
ix——通过行标签或者行号索引行数据(基于loc和iloc 的混合)
In [20]: sr = pd.Series({'a': 1, 'b': 2}) In [21]: sr.loc['a'] Out[21]: 1 In [22]: sr.iloc[1] Out[22]: 2 In [23]: sr.ix['b'] Out[23]: 2 In [24]: sr.ix[0] Out[24]: 1
Series数据对齐
pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。
s1 = pd.Series([12, 23, 34], index=['c', 'a', 'd']) s2 = pd.Series([11, 20, 10], index=['d', 'c', 'a']) print(s1 + s2) # 按索引相加 s2 = pd.Series([11, 20, 10], index=['b', 'c', 'a']) print(s1 + s2) # 按索引相加,出现Nan值 在两个Series对象相加时将缺失值设为0 s1.add(s2, fill_value=0)
缺失数据处理
print(sr.isnull()) # 等于NaN是True print(sr.notnull()) # 不等于NaN是True print(sr[sr.notnull()]) # 过滤空值 print(sr.dropna()) # 过滤空值 print(sr.fillna(0)) # 填充空值
Pandas之DataFrame
DataFrame是一个表格型的数据结构,含有一组有序的列。
DataFrame可以被看做是由Series组成的字典,并且共用一个索引
创建方式及常用属性
data = [[1, 2, 3], [4, 5, 6]] index = ['x', 'y'] columns = ['a', 'b', 'c'] df = pd.DataFrame(data=data, index=index, columns=columns) print(df.loc['x']) # 指向x索引的行 print(df.iloc[1]) # 指向第二行 print(df.loc['x', 'a']) # 指向x索引的行,a列 print(df.loc['x', ]) # 指向x索引的行,所有列 print(df.index) # 行索引 print(df.columns) # 列索引 print(df.T) # 转置 print(df.values) # 值(二维数组) print(df.describe()) # 每列的统计信息
数据对齐与缺失数据
DataFrame对象在运算时,同样会进行数据对齐,行索引与列索引分别对齐。
结果的行索引与列索引分别为两个操作数的行索引与列索引的并集。
DataFrame处理缺失数据的相关方法:
- dropna(axis=0,where=‘any’,…) 过滤掉值为NaN的行
- fillna() 填充缺失数据
- isnull() 返回布尔数组,缺失值对应为True
- notnull() 返回布尔数组,缺失值对应为False
df = pd.DataFrame({'one': ['1', '2', np.NAN], 'two': ['a', np.NAN, np.NAN]}) print(df.fillna('0')) # 填充所有带有空的元素 print(df.dropna()) # 删除所有带有空的行 print(df.dropna(how='all')) # 删除所有每列都有空的行 df.loc[2, 'one'] = '3' # 修改值 print(df) print(df.dropna(axis=1)) # 删除为空值的列
pandas:常用方法
- mean #求平均值 - sum #求和 - sort_index #按行或列索引排序 - sort_values #按值排序 - apply(func,axis=0) #axis=0指的是逐行,axis=1指的是逐列。 df.apply(lamada x:x.mean()) #按列求平均 df.apply(lamada x:x['high']+x["low"])/2,axis=1) #按列求平均(最高价和最低价的平均) df.apply(lamada x:x['high']+x["low"])/2,axis=1) #按列求平均(最高价和最低价的平均) - applymap(func) #将函数应用在DataFrame各个元素上 - map(func) #将函数应用在Series各个元素上
举例:
df = pd.DataFrame({'one':[1,2,3],'two':[4,5,6],'three':[7,8,9]} ,index=['a','b','c'] ) print(df.mean()) # 按列求平均值 # one 2.0 # two 5.0 # three 8.0 print(df.mean(axis=1)) # 按行求平均值 # a 4.0 # b 5.0 # c 6.0 print(df.sum()) # 求和 # one 6 # two 15 # three 24 print(df.sort_values(by='two')) # 值排序 print(df.sort_values(by='two',ascending=False)) # 值排序(倒序) print(df.sort_values(by='a',ascending=False,axis=1)) # 按行值排序(倒序) print(df.sort_index()) # 索引值排序 print(df.sort_index(ascending=False)) # 索引值排序(倒序) print(df.sort_index(ascending=False,axis=1)) # 按行索引值排序(倒序)
时间对象处理
Python标准库:datetime datetime.datetime.timedelta # 表示 时间间隔 dt.strftime() #f:format吧时间对象格式化成字符串 strptime() #把字符串解析成时间对象p:parse 灵活处理时间对象:dateutil包 dateutil.parser.parse('2019/1/29') 处理时间对象:pandas pd.to_datetime(['2011-01-01', '2012-02-02'])
产生时间对象数组:date_range start 开始时间 end 结束时间 periods 时间长度 freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),… 1、时间序列就是以时间对象为索引的Series或DataFrame。 2、datetime对象作为索引时是存储在DatetimeIndex对象中的。 3、时间序列特殊功能: 传入“年”或“年月”作为切片方式 传入日期范围作为切片方式 丰富的函数支持:resample(), strftime(), …… 批量转换为datetime对象:to_pydatetime()
举例
# 转换时间对象 print(pd.to_datetime(['2001-01-01','2001-Feb-21'])) # 生成时间序列 print(pd.date_range('2010-01-01','2011-01-01')) print(pd.date_range('2010-01-01',periods=10)) print(pd.date_range('2010-01-01',periods=10,freq='H')) # 按小时 print(pd.date_range('2010-01-01',periods=10,freq='W')) # 按周 print(pd.date_range('2010-01-01',periods=10,freq='W-MON')) # 按周一 print(pd.date_range('2019-09-01',periods=30,freq='B')) # 按工作日 sr = pd.Series(np.arange(100),index=pd.date_range('2018-01-01',periods=100)) print(sr.index) print(sr['2018-04']) print(sr['2018-03-01':'2018-03-15']) print(sr.resample('M').sum())
读取文件
read_csv 读取csv文件
read_excel 读取excel文件
读取文件函数主要参数:
- sep 指定分隔符,可用正则表达式如'\s+'
- header=None 指定文件无列名
- name 指定列名
- index_col 指定某列作为索引
- skip_row 指定跳过某些行
- na_values 指定某些字符串表示缺失值
- parse_dates 指定某些列是否被解析为日期,布尔值或列表
print(pd.read_csv('600519.csv',index_col=0)) # 用第1列做索引 print(pd.read_csv('600519.csv',index_col='date')) # 用date列做索引 pd_csv = pd.read_csv('600519.csv',index_col='date',parse_dates=['date']) # 用date列做索引, 并转化为datetime类型 print(pd_csv.index) df.rename(column={0:'a',1:"b"}) #修改列名 print(pd.read_csv('600519.csv',header=None, names=list('abcdefgh'))) # 指定列名 pd.read_csv('600519.csv',header=None, na_values=['None']) # 指定字符串None为Nan
写入文件
1、写入到文件:
- to_csv
2、写入文件函数的主要参数:
- sep
- na_rep 指定缺失值转换的字符串,默认为空字符串
- header=False 不输出列名一行
- index=False 不输出行索引一列
- cols 指定输出的列,传入列表
3、其他文件类型:json, XML, HTML, 数据库