结合实际案例,所有操作都是本人亲自实践,作为以后自己使用pandas时的用户手册。
目录
第1章 Pandas初步认识
1.1 创建对象
一般有两种创建Series和DataFrame的方法,通过字典dict()或者利用Numpy+Index+columns的方法,方法一适合简单的情形,方法二更清晰。
import pandas as pd
import numpy as np
# 创建Series对象
Series_object=pd.Series(data=[1,2,'s','2021-1-1'],index=['A','B','C','D'])
Series_object
# 通过numpy,创建Dataframe对象
Dataframe_object=pd.DataFrame(data=np.random.randn(2,2),index=
pd.date_range('20210101',periods=2),columns=list('AB'))
Dataframe_object
# 通过字典,创建Dataframe对象
Dataframe_object2=pd.DataFrame({'A':pd.Timestamp('20210101'),
'B':pd.Series(1,index=list(range(3))),
'C':pd.Categorical(['one','two','three'])})
Dataframe_object2
# 我们可以通过dtypes查看列的属性
Dataframe_object2.dtypes
1.2 查看数据
Pandas具有简单的查看数据功能,前期对数据要有一定的整体把握。案例的原始数据为:
# 查看前5行数据
Dataframe_object.head()
# 查看后2行数据
Dataframe_object.tail(2)
# 查看表格的索引
Dataframe_object.index
# 查看表格的列名
Dataframe_object.columns
# 将DataFrame转化为Numpy
Dataframe_object.to_numpy()
# 基本的表格统计描述
Dataframe_object.describe()
# 转置表格
Dataframe_object.T
1.3 筛选数据
Pandas筛选数据非常方便,一般有两种选择方法,通过loc[]选择标签、通过iloc[]选择索引位置。
# 选择某一列,类似于df.A
Dataframe_object['A']
# 通过行、列名选择
Dataframe_object.loc[['20210101','20210103'],['A','B']]
# 通过索引的位置选择
Dataframe_object.iloc[1:3,[0,2]]
# 条件选择
Dataframe_object[(Dataframe_object['A']>0)&(Dataframe_object['B']<0)]
1.4 处理丢失数据
Pandas的丢失数据用np.nan代替,不参与计算,所以必须处理丢失数据。本案例的原始数据为:
# 去掉所有含有np.nan的行
Dataframe_object.dropna(how='any')
# 填充np.nan
Dataframe_object.fillna(value=100)
# 找到np.nan的位置,用于筛选
pd.isna(Dataframe_object)
1.5 表格连接
一般有两种连接方式,一种是concat,一种是merge,merge更像SQL风格。
# 通过concat重新连接表格,行操作都是很快
pieces=[Table_concat[3:],Table_concat[:3]]
pd.concat(pieces)
# 通过merge连接表格
Table_merge1=pd.DataFrame({'name':['Sam','Succi'],'Age':[10,12]})
Table_merge2=pd.DataFrame({'name':['Sam','Succi'],'Grade':[64,62]})
pd.merge(Table_merge1,Table_merge2,on='name')
1.6 分组
通过分组我们可以:(1)把表格分成不同的组别;(2)对每个组别进行独立的Apply操作;(3)结果分析。
# 计算A中不同组别的C的和
Table_group.groupby('A').sum()
# 二级分组后的A、B组别的C的和
Table_group.groupby(['A','B']).sum()
1.7 数据透视表
针对1.6的原始数据,做一个简单的数据透视。
# 数据透视表
pd.pivot(Table_group,values='C',index='A',columns='B')
1.8 时间序列
pandas的时间序列很强大,适用于金融等采样工作。
# 首先建立样本
time_series = pd.date_range("1/1/2021", periods=10, freq="D")
sample = pd.Series(np.random.randint(0, 500, len(time_series)), index=time_series)
sample
# 按照2天一次重新采样
sample.resample('2D').sum()
1.9 分类别的数据(Categoricals)
Pandas可以设置数据的类别,从而方便的进行筛选、Apply等操作。
# 原始数据
cate=pd.DataFrame({"id": [1, 2, 3, 4, 5, 6], "raw_grade": ["a", "b", "b", "a", "a", "e"],'grade':[76,65,43,55,56,87]})
cate
# 把a/b/c三种数据改成类别
cate['class']=cate['raw_grade'].astype('category')
cate['class']
# 重新改变类别的名称
cate['class'].cat.categories = ["nice", "general", "bad"]
cate
# 查看不同类别数据的数据平均分
cate.groupby('class')['grade'].mean()
1.10 画图
# 生成两列时间序列数据
rand_number=pd.DataFrame(np.random.randn(1000,2), index=pd.date_range("1/1/2021", periods=1000),columns=['S1','S2'])
rand_number
# 统计累计和情况
rand_number=rand_number.cumsum()
rand_number
# 画图
import matplotlib.pyplot as plt
plt.close("all")
rand_number.plot()
plt.legend(loc='best')
1.11 读取/存储数据
一般的数据格式包络csv/HDF5/EXCEL等,相应的读取方式为:pd.read_csv、pd.read_hdf、pd.read_excel,存储方式为:df.to_csv、df.to_hdf、df.to_excel。
第2章 Pandas数据结构
2.1 Series
Series是一维数据结构,可以包含任何数据形式,同时通过Index进行查找。在创建Series的时候,一般有两种方式:
# 方法一,通过numpy+index创建
Series_test=pd.Series(np.random.randn(6),index=['A','B','C','D','E','F'])
Series_test
# 方法二,通过字典创建
Series_test2=pd.Series({'A':1,'B':'moore','C':1.3,'D':'2021-1-1'})
Series_test2
Series和ndarray非常像,很多Numpy函数都可以使用,同时切片等矢量化操作也可以使用。
# 切片
Series_test[[1,3]]
# 查看类型
Series_test.dtype
# 转化成ndarray
Series_test.to_numpy()
# 通过Index切片
Series_test['E']
# index没有的时候,防止报错可以使用get方法
Series_test.get('S','没有数据')
# 矢量化操作
np.exp(Series_test)
# 矢量操作时,如果不同的数据错位,在生成的新Series中的Index就会填充nan
Series_test[:-1]+Series_test[1:]
2.2 DataFrame
(1)创建DataFrame的方法主要有以下5种:
- 字典
- 2维的numpy.ndarray
- 结构化的ndarray
- Series
- 其他的DataFrame
# 通过字典创建
Dataframe_test=pd.DataFrame({'name':['kim','sac','ret'],'year_old':[12,32,43],'sex':['M','F','M']},index=[1,2,3])
Dataframe_test
# 通过numpy或者List创建
Dataframe_test2=pd.DataFrame(np.random.rand(2,2),index=['A','B'],columns=['kim','sac'])
Dataframe_test2
# 通过具名元组namedtuple
from collections import namedtuple
name_tuple=namedtuple('student','kim sac ret')
pd.DataFrame([name_tuple(2,3,4),name_tuple(1,2,2),name_tuple(2,5,6)])
(2)列的操作包括:列运算、增加列、删除列。
# 列互相运算,此方法可以通过assign来简化
df_columns['C']=df_columns['A']+df_columns['B']
df_columns
# 通过判断新增列
df_columns['judge']=df_columns['A']>1
df_columns
# 通过series新增列
df_columns['series1']=pd.Series(['kim','sac','ret'],index=[0,1,2])
df_columns
# 通过插入新增列
df_columns.insert(1,'insert_column',[1,1,1])
df_columns
# 删除列
del df_columns['judge']
df_columns
(3)数据对齐
# 数据整合对齐
data1=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
data2=pd.DataFrame({'A':[1,2,3,4],'B':[4,5,6,7],'C':[5,6,7,8]})
data1+data2
(4)和numpy 的互相操作
Dataframe和Series同样适用于numpy的众多函数,比如log, exp, sqrt,maximum等。
(5)pandas的默认显示
pandas通过display()设置默认的显示方式,这点在我之前的文章已经详细介绍过,参考连接:https://blog.youkuaiyun.com/qq_40732962/article/details/114198875。