导图社区 Pandas内容与架构
关于Pandas内容与架构的思维导图,包含了数据对象:Series对象、DataFrame对象、Index对象;数据读取、数据写入、数据预处理等内容,非常实用,值得收藏。
编辑于2023-03-02 15:44:58 广东Pandas
数据对象
Series对象
多种类型的数据 通过索引值访问元素 可看成带索引的一维数组
创建
a=pd.Series([1,2,3],index=['item1','item2','item3'])
item1 1 item2 2 item3 3 dtype: int64
b=pd.Series([1,2,3])
0 1 1 2 2 3 dtype: int64
一般要指定索引 当不指定索引时,索引为元素序号
c=pd.Series({'item1':1,'item2':2,'item3':3})
字典转化为Serise类型 item1 1 item2 2 item3 3 dtype: int64
查询
索引值访问
类似字典
a['item1']
1
位置下标访问
类似数组
a[2]
3
数据值访问
a.values
[1,2,3]
索引值访问
a.index
['item1', 'item2', 'item3']
切片
遍历
for idx,val in a.iteritems(): print(idx,val)
item1 1 item2 2 item3 3
添加
连接两个series并返回新的series(不改变原数据)
series1.append(series2)
删除
删除指定索引值对应的series元素,并返回删除后的series (不改变原数据)
series.drop('index')
DataFrame对象
类似数据库的table 有标签的二维数组 横向行,纵向列,都有索引 每列有列名 列中数据必须一致
创建
data是待转化数据(字典,nadarry数组等) index:索引值 columns:列名 如果不指定索引,则以数据序号作为索引
pd.DataFrame(data,index=None,columns=None,dtype=None,copy=None)
添加
添加行
df.append(数据,ignore_index=True)
在末尾添加数据(列表、字典、Series)返回新表 ignore_index=True忽略索引值,索引值重排序
添加列
赋值
df[列名]=数据列表
指定位置
df.insert(位置索引,列名,数据列表)
删除
删除行
df.drop(行名列表,axis=0)
df.drop(index=行名列表)
df.drop(df.index[行索引列表,axis=0])
删除列
df.drop(列名列表,axis=1)
df.drop(columns=列名列表)
df.drop(df.columns[列索引列表,axis=1])
del df[列名]
df.pop(列名)
删除列 返回的是被删除列的内容 原被表修改
Index对象
包括行索引与列索引 结构类似数组,但内容不可修改(不能单个修改,但可以整体重新赋值)
索引
显示索引
df.index/df.columns
其他类型转换索引对象
idx=pd.Index(["x","y","z"])
idx.values 查看Index中所有值
修改索引
重新赋值
df.index/df.columns=行/列名列表
重排顺序
df.reindex(行名列表)/df.reindex(columns=列名列表)
df.sort_index()
重新设置行索引名
df.set_index(列名)
重命名索引
单个或者部分
df.rename(columns={"旧索引名1":"新索引名1","旧索引名2":"新索引名2"})
df.rename(index={"旧索引名1":"新索引名1","旧索引名2":"新索引名2"})
多重索引
查看索引
df.columns.values
重组索引
df.columns=['_'.join(col).strip( ) for col in df.columns.values ]
数据读取
df=pd.read_excel(路径+文件名)
r“路径+文件名”解决反斜杠问题 sheet_name="表名"或者表顺序索引 index_col=0 (默认0,从0开始计数) header=0(指定行作为列索引,默认第一行) usclos=列索引列表(指定导入的列) nrows=n(导入前n行)
df = pd.read_sql_query(sql=None, con=None)
使用sqlalchemy的连接引擎 示例代码: from sqlalchemy import create_engine engine = create_engine('mssql+pymssql://sa:comfortgroup2016{@192.168.0.99:1433/WG_DB?charset=GBK') sqlStr = "select" df = pd.read_sql_query(sql=sqlstr, con=engine)
df=pd.read_csv( )
指明分隔符号
sep=" "(空格,逗号,制表符\t)
指定编码格式
encoding=(gbk或者utf-8或者utf-8-sig(文件路径或名含中文))
engine=(默认C,文件路径或名含中文则改成python)
熟悉数据
数据预览
df.head()
数据表大小
df.shape()
数据类型
df.inof()
数值型数据基本统计
df.describe()
数据写入
写入Excel
创建新的Excel文件
示例代码1: import pandas as pd import numpy as np df1 = pd.DataFrame(np.arange(7)) df2 = pd.DataFrame(np.arange(7)) writer = pd.ExcelWriter('Excel.xlsx') df1.to_excel(writer, 'first') df2.to_excel(writer, ;second') writer.save() 示例代码2: import pandas as pd df1.to_excel('Excel.xlsx', index=False)
在原Excel文件的基础上增加页
示例代码: import a=pandas as pd from openpyxl import load_workbook book = load_workbook('Excel.xlsx') writer = pd.ExcelWriter('Excel.xlsx', engine='openpyxl') writer.book = book df1.to_excel(writer, 'first', index=False) df2.to_excel(writer, 'second') writer.save()
数据预处理
缺失值处理
缺失值查看
返回每一列缺失情况
返回每列非空的值个数 需要和其他列比较
df.inof()
返回布尔列表
缺失值返回True 非缺失返回False
df.isnull()
缺失值删除
df.dropn()
默认删除含缺失值的行 如果传入参数how="all" 则只会删除全为空的行
缺失值填充
对所有缺失值进行填充
df.fillna(填充的东西)
对指定列进行填充
df.fillna({列名1:填充值1},{列名2:填充值2})
重复值处理
对整表处理
df.drop_duplicates()
keep=first(默认first保留第一个) 参数也可以是last,保留做后一个 或者False,全部删除(不常用)
指定列名去重
df.drop_duplicates(subset=列名列表)
异常值处理
数据类型转换
查看每一列数据类型
df.inof()
查看指定列数据类型
df[列名].dtype
替换指定列数据类型
df[列名].astype(新的数据类型)
索引设置(见Index对象)
数据选择
列选择
df["列名"] df[列名列表]
df.iloc[:,[0,2]]
df.iloc[:,0:3]
行选择
df.loc["行名"] df.loc[行名列表]
df.iloc[0] df.iloc[[0,4]]
df.iloc[0:5]
行列同时选择
df.loc[行名列表,列名列表]
df.iloc[[0,4],[0,2]]
df.iloc[0:5,0:3]
df[df["列名"]<条件>]<选择行列>
df.ix[0:3,["列名1","列名2"]]
布尔索引选择满足条件的行
单条件
df[df["列名"]<条件>]
多条件
df[(df["列名1"]<条件1>)&(df["列名2"]<条件2>)]
数据分组/透视表
分组
分组键是列名
df.groupby("列名")【["列名"]】.sum( )/count( )等
分组键是Series
df.groupby(df["列名"])【["列名"]】.count( )/sum( )
聚合
df.groupby("列名").aggregate(["count","sum"])
df.groupby("列名").aggregate({"用户":"count","某月销量":"sum"})
转换
df.groupby("列名")[列名].transform(lambda x : x-x.mean())
过滤
df.groupby("列名").filter(lambda df : False if df[列名]<条件> else True)
apply优化
聚合
df.【groupby("列名")】.apply(聚合函数)
转换
df.【groupby("列名")[列名]】.apply(lambda x : x-x.mean())
过滤
df.【groupby("列名")】.apply(lambda df : df if df[列名]<条件> else None)
透视表
pd.pivot_table()
data:数据表df values:统计的值 index:行 columns:列 aggfunc:对values的计算类型 fill_value:空值的填充值 margins:是否显示合计列True/False margins_name:合计列列名 dropna:是否删除缺失,默认False, 为True则删除整行
重置索引
pd.pivot_table(……).reset_index()
数值操作
数值替换
一对一替换
df[列名].replace(old,new,inplace=True)
一对多替换
df[列名].replace([old1old2,old3],new)
多对多替换
df[列名].replace({old1:new1,old2:new2,old3:new3})
缺失值替换
df.replace(np.NaN,0)
数值排序
按照一列数值排序
df.sort_values(by=[列名],ascending=True)
默认True为升序 降序为False
按照多列数值排序
df.sort_values(by=列名列表,ascending=对应升降序列表)
ascending=由True或者False组成的列表
按照有缺失值列排序
df.sort_values(by=[列名],na_position="last")
na_position表示缺失值排在前面还是最后 缺失值在前面用first 缺失值在后面用last
数值排名
df[列名].rank(method="min")
method可取average,min,first,max average:当排名有重复值时返回重复值的平均排名 min:当排名有重复值时,返回重复值最佳排名(常见) first:当排名有重复值时,先出现的排名靠前 max:当排名有重复值时,返回重复值最差排名
数值删除(见数据对象)
数值计数
df[列名].value_counts( )
参数normalize:是否用百分比显示(默认False) 参数sort:是否按计数值降序排列(默认True)
唯一值获取
df[列名].unique( )
数值查找
返回布尔值的列或者表
df[列名].isin([值1,值2])
df.isin([值1,值2])
区间划分
指明区间
pd.(df[列名],bins=[0,3,6,10])
指明份数
pd.qcut(df["列名"],份数)
插入行或列(见数据对象)
行列互换
df.T
索引重塑
树形层次化索引
df.stack( )
恢复表格型数据
df.stack( ).unstack( )
长宽表转换
宽表转为长表
stack( )方法
df.set_index(["列名1","列名2"]).stack( )【.reset_index( )】
melt( )方法
df.melt(id_vars=[保持不变的列集合],var_name=列索引转行索引的列名,value_name=新索引对应的值的列名)
长表转为宽表
df.pivot_table(index=[不变的列集合],columns=行索引转列索引的列名,values=值的列名)
apply与applymap函数
df["列名"].apply(lambda x:x+1)
df.applymap(lambda x:x+1)
数据运算
算数运算
比较运算
返回布尔表
汇总运算
count非空值计数
df【[列名]】.count( )
参数axis默认0为求取每一列非空值个数 1为求取每一行非空值个数
sum求和
df.groupby(df[列名], as_index=False).sum()
as_index=False,即是不重新创建index,保证行列都只有一个
mean求均值
max求最大值
min求最小值
median求中位数
mod求众数
var求方差
std求标准差
quantile求分位数
df.quantile(0.25)
括号中指明要求取的分位数值 0.25 0.5 0.75
相关性运算
计算某两列的相关性
df[列名1].corr([列名2])
计算各列两两相关性
df.corr( )
时间处理
获取时间
返回当前日期和时间
datetime.now( )
当前时间年、月、日
datetime.now( ).year/month/day/hour/minute/second
当前时间周几
datatime.now( ).weekday( )+1
当前时间周数
datatime.now( ).isocalendar( )[1]
构造时间
datatime(2020,2,29)
时间段处理
求时间差
print(时间对象1-时间对象2)
指定时差逆向计算
print(时间对象+timedelta(days=3))
指定日期和时间格式
datatime( ).now( ).strftime("%Y-%m-%d %H:%M:%S")
时间序列操作
时间日期类型索引
数据类型为DatetimeIndex
df.index=pd.to_datetime(时间列表)
指定范围构造
pd.date_range(start=起始时间,end=结束时间,freq=间隔频率 )
参数freq支持 年y,季度q,月m,天d 小时h,分钟t,秒s等 复杂时间如1h30min也支持
时间段类型索引
保存了起始和终止两个时间点 数据类型为PeriodIndex
df.to_period(freq='M')
df.to_timestamp( )
筛选和切分
data["2019-01-01":"2019-01-20"]
df[df["时间列"]<条件符号>datatime(2019,3,14)]
重采样
降采样聚合
df.resample('w').sum( )
降采样ohlc
df.resample('M').ohlc( )
升采样插补数据
df.resample('D').interpolate( )
偏移操作
df['prev']=df['val'].shift(self,periods=1,freq=None,axis=0,fill_value=None)
参数period:默认为1,取前项数据 如果为负数则取后项数据
滑动窗口
DataFrame.rolling(window,min_periods=None,center=False……)
参数window:窗口大小 参数min_periods:窗口中最小观测值的数据量,达不到则为空 参数center:是否使用window的中间值作为label,默认false 参数win_type:窗口类型,默认为None一般不特殊指定 参数on:如果不使用索引指定列,那么用on来指定使用哪列 参数closed:定义区间的开闭,默认None 参数axis:方向(轴),一般都是0
DataFrame.ewm(self, com=None, span=None, halflife=None, alpha=None……)
参数com :根据质心指定衰减,α=1/(1+com), for com≥0。 参数span :根据范围指定衰减,α=2/(span+1), for span≥1。 参数halflife :根据半衰期指定衰减,α=1−exp(log(0.5)/halflife),forhalflife>0。 参数alpha :直接指定平滑系数α,0<α≤1。 参数min_periods:窗口中具有值的最小观察数(否则结果为NA) 参数adjust :除以开始阶段的衰减调整因子,以解释相对权重的不平衡(将EWMA视为移动平均线)。 参数ignore_na :默认为False,计算权重时忽略缺失值;指定True可重现0.15.0之前的行为。 参数axis :一般为0
时区转换
pytz
要导入pytz库
查看可支持的时区列表
pytz.common_timezones[:3]
转换
utc_dt=pytz.utc.localize(time) tz=timezone('Asia/Shanghai') utc_dt.astimezone(tz)
pandas
指定时区为格林尼治时间
df.index.tz_localize('UTC')
转化到指定时区时间
df.index.tz_convert('UTC')