pandas数据分析
- 基本数据结构
对象类型 | 含义 | 用途 |
DataFrame | 二维数据对象 | 按列组织的表格数据 |
Series | 一维数据对象 | 单一(时间)数据序列 |
Series相当于是特殊的DataFrame数据
DataFrame类
import pandas as pd #导入pandas
df = pd.DataFrame([10,20,30,40],
columns=['numbers'],index=['a','b','c','d']) #定义列表形式的数据
print(df)
输出
numbers
a 10
b 20
c 30
d 40
- df.index 可以查看index属性和index对象
- df.columns 查看columns属性和index对象
- df.loc[‘index’] 选择对应着索引为index的值
- df.loc[‘id1’,‘id2’] 选择对应索引id1,id2的两个值
- df.iloc[1:3] 输出第二和第三行的值,注意是左闭右开的区间
- df.sum() 计算单列总和
- df.apply(lambda x:x ** 2) 计算每一个索引对应的平方值
- df ** 2 也是求平方
与Numpy对象不同的是,我们可以在两个维度上同时扩增DataFrame对象
- 例如:df[‘floats’] = (1.5,2.5,3.5,4.5)
_ | numbers | floats |
a | 0 | 1.5 |
b | 20 | 2.5 |
c | 30 | 3.5 |
d | 40 | 4.5 |
- 也可以使用整个DataFrame对象来定义一个**新列**,此时,索引会自动对齐
df['name']=pd.DataFrame(['Sandra','Lilli','Henry'],index=['d','a','b','c'])
# 以下例子可以避免索引被简单的索引代替
# 顺序索引:如果已存在的有123,那么这里就是4
df.append({'numbers':100,'floats':5.75,'names':'Jil'},ignore_index=True)
# 这里就可以自定义新的索引为y
df=df.append(pd.DataFrame({'numbers':100,'floats':5.75,'names':'Jil'},index=['y',]))
# 返回各列的dtype
print(df.dtypes)
#分别求两列均值(忽略带NaN的行)
df[['numbers','floats']].mean()
#分别求两列的标准差(忽略带NaN的行)
df[['numbers','floats']].std()
- 用ndarray对象创建DataFrame对象
df = pd.DataFrame(ndarray)
- 为了高效处理金融时间序列数据,pandas可以很好地处理时间索引成为优势
dates = pd.date_range('2019-1-1',periods=9,freq='M')
data_range()函数的参数
参数 | 格式 | 描述 |
start | 字符串 | 起始日期 |
end | … | 终止日期 |
periods | 整数/None | 期数 |
freq | 日期偏移 | 频率字符串,例如5D(5天) |
关于更多的date_range()中freq的选项详情见书p117页
基本分析
- df.info() 提供关于数据、列和索引的元信息
- df.describe() 提供有用的每列汇总统计(对于数值数据)信息
df.sum() #列求和
df.mean() #列均值
df.mean(axis=0) #列均值
df.mean(axi=1) #行均值
df.cumsum() #列累计总和(从第一个索引位置起依次累加)
基本可视化
DataFrame对象的折线图
from pylab import plt,mpl
plt.style.use('seaborn')#以上两步均是为了确定绘图样式
mpl.rcParams['font.family']='serif'
%matplotlib inline
# 绘制4列累计总和的折线图
df.cumsum().plot(lw=2.0,figsize=(10,6))
pandas提供了专为DataFrame对象设计的matplotlib包装器
plot()参数详见p123
df.plot.bar(figsize=(10,6),rot=15) #绘制柱状图
Series类
Series是pandas自带的类
特点是仅有一列数据
从多列的DataFrame对象上选取一列,可以得到Series对象
#相当于设置格式:范围为0-15,均分成7份,index默认从0开始
S=pd.Series(np.linspace(0,15,7),name='series')
GroupBy操作
pandas具备强大灵活的分组功能
为了分组,现添加1列
df['Quarter'] = ['Q1','Q2','Q1']
这一操作产生的结果是多了一列Quarters的值为Q1,Q2,Q1
groups=df.groupby('Quarter') #根据Quarter那列分组
groups.size() #给出每种分组的个数,例如上面有2个Q1,1个Q2
groups.mean() #每列均值
groups.max() #每列最大值
groups.aggregate([min,max]).round(2) #每列的最小值和最大值
另外,分组也可以在多列上面进行。
以上均为对于pandas和Dataframe对象使用的介绍。
以下是应用。
【1】复杂选择
#生成符合标准正态分布随机数的ndarray对象
data=np.random.standard_normal((10,2))
#包含相同随机数的DataFrame对象
df=pd.DataFrame(data,columns=['x','y'])
df.info()
#取得前5行
df.head()
#取最后5行
df.tail()
- Python比较运算符和逻辑运算符在两列值上的应用
df['x'] > 0.5 #检查x列的值是否大于0.5
(df['x'] > 0) & (df['y'] < 0)#检查是否x列大于0且y列为负
df['x'] > 0 | (df['y'] < 0)#检查是否x列大于0或y列为负
df > 0 #DataFrame对象中哪些值为正
df[df>0] #选择所有满足df>0的值,且将剩下的值设为NaN
【2】联接、连接和合并
df1=pd.dataframe([...],index=['x','...'],columns=['A',])
df2=...
df1.append(df2,sort=False)#直接复制df2的索引
df1.append(df2,ignore_index=True,sort=False)#接着df1的索引
#df1的索引值有意义——只有第一个DataFrame对象的索引值被使用
df1.join(df2)