数据分析|Pandas库函数总结


Pandas库函数总结

  • 1. Series创建及增删改查
  • 2. DataFrame创建及增删改查
  • 3. Pandas常用函数
  • 4. Pandas常用统计函数
  • 5. Pandas读取与存储
  • 6. JSON库与Pandas库转化
  • 7. Pandas数据分组与聚合

引入Pandas库:
import Pandas as pd import json

补充:
(1) Series与DataFrame可以直接使用numpy的函数,例如np.abs(df):对DataFrame的数据取绝对值
(2) 处理JSON数据时需要引入JSON库
1. Series创建及增删改查
方式 示例 备注
通过list创建 pd.Series([1,2,3,4,5])
通过numpy数组创建 pd.Series(np.arange(1,6))
通过字典创建 pd.Series({‘name’:‘李宁’,‘age’:18,‘class’:‘三班’}) name,age,class为索引
重新索引 ps.reindex([‘a’,‘b’,‘c’,‘d’,‘e’,‘f’]) reindex 创建一个符合新索引的新对象,可利用fill_value参数对缺失值进行填充
增-方式1 ps[‘g’] = 9 在原Series对象上增加g索引
增-方式2 ps.append(pd.Series({‘f’:999})) 增加索引并生成新的Series对象
删-方式1 del ps[‘b’] 删除Series中索引b的值(在原有数据结构上删除)
删-方式2 ps.drop(‘g’) 删除索引g 产生新的对象(删除一条)
删-方式3 ps1.drop([‘c’,‘d’]) 删除多条
改-方式1 ps[‘a’]=999 通过标签修改
改-方式2 ps[0] = 888 通过位置索引修改
查-行索引 ps[‘a’] 查看标签索引a对应的值
查-行索引 ps[0] 查看位置索引0对应的值
查-切片索引 ps[1:4] 位置切片索引(取不到末位)
查-切片索引 ps[‘b’:‘d’] 标签切片索引(可以取到末位)
查-不连续索引 ps[[‘b’,‘e’]] 标签索引
查-不连续索引 ps[[0,2]] 位置索引
查-布尔索引 ps[ps>2] 查询出值大于2的数据
高级索引-loc标签索引 ps.loc[‘a’:‘c’] 截取索引a-c之间的行
高级索引-iloc位置索引 ps.iloc[1:3] 不包含末位数据
补充:创建Series对象时可通过index参数指定索引
2. DataFrame创建及增删改查
方式 示例 备注
字典类 data = https://www.it610.com/article/{‘a’:[1,2,3,4],‘b’:[5,6,7,8],‘c’:np.arange(9,13)} frame = pd.DataFrame(data) 数组、列表或元祖构成的字典构造dataframe
字典类 pd.DataFrame({‘a’:pd.Series(np.arange(3)),‘b’:pd.Series(np.arange(3,5))}) Series构成的字典构造dataframe
字典类 data1 = {‘a’:{‘apple’:3.6,‘banana’:5.6},‘b’:{‘apple’:3,‘banana’:5},‘c’:{‘apple’:3.2}} pd2 = pd.DataFrame(data1) 字典构成的字典构造dataframe
列表类 pd.DataFrame(np.arange(12).reshape(4,3)) 2D ndarray 构造dataframe
列表类 l1 = [{‘apple’:3.6,‘banana’:5.6},{‘apple’:3,‘banana’:5},{‘apple’:3.2}] pd.DataFrame(l1) 字典构成的列表构造dataframe
列表类 l2 = [pd.Series(np.random.rand(3)),pd.Series(np.random.rand(2))] pd.DataFrame(l2) Series构成的列表构造dataframe
重新行索引 pd1.reindex([‘a’,‘b’,‘c’,‘d’]) DataFrame行索引重建,可利用fill_value参数对缺失值进行填充
重新列索引 pd1.reindex(columns=[‘C’,‘B’,‘A’]) DataFrame列索引重建,可利用fill_value参数对缺失值进行填充
增(列)-方式1 pd1[4] = 9 增加列(在原DataFrame上操作),新增列的值全为9
增(列)-方式2 pd1.insert(0,‘E’,[9,99,999]) 插入列(在原DataFrame上操作),第0个位置插入索引为E的列值为[9,99,999]
增(行)-方式1 pd1.loc[‘d’] = [1,1,1,1,1] 标签索引loc,该方式在原DataFrame操作
增(行)-方式2 pd1.append(row,ignore_index=True) 追加新的行 生成新的dataframe (ignore_index忽略原来的索引)
删(列)-方式1 del pd1[‘E’] 删除DataFrame中索引为E的列(在原有数据结构上删除)
删(列)-方式2 pd1.drop(‘A’,axis=1) axis=1为删除列
删(列)-方式3 pd1.drop(‘A’,axis=‘columns’) 与axis=1等价
删(行)-方式1 pd1.drop(‘a’) drop默认删除行索引,删除索引为a的一行数据(删除一条)
删(行)-方式2 pd1.drop([‘a’,‘d’]) 删除多条,drop可加参数inplace:True表示在原对象上删除,并不会返回新的对象
改(列)-方式1 pd1[‘A’] = 9或pd1[‘A’] = [9,10,11] 索引A列的数据全部更改为9或改为数组中的对应值
改(列)-方式2 pd1.A = 6 对象.列的形式修改数据值
改(行) pd1.loc[‘a’] = 777 loc标签索引
改(某行某列) pd1.loc[‘a’,‘A’] = 1000 修改a行A列的数值
查-列索引 pd1[‘A’]
查-列索引 pd1[[‘A’,‘C’]] 取多列
查-选取一个值 pd1[‘A’][‘a’] 选取A列a行的数据值
查-切片 pd1[:2] 获取前两行
高级索引-loc标签索引 pd1.loc[‘a’:‘b’,‘A’] 取到a-b之间行的A列
高级索引-iloc位置索引 pd1.iloc[0:2,0:3] 取到0-1行的0-2列数据(不包含末位数据)
补充:创建DataFrame对象可通过index指定行索引、columns指定列索引
3. Pandas常用函数
函数名 说明 示例使用 备注
index Series或DataFrame查询索引 s1.index s1为变量名称,DataFrame查询行索引
columns DataFrame查询列索引 frame.columns frame为变量名称
values Series或DataFrame查询值 s1.values s1为变量名称
isnull Series或DataFrame判断是否为空 空则为True s3.isnull() s3为变量名称
notnull Series或DataFrame判断是否为空 非空则为True s3.notnull() s3为变量名称
name Series的Name属性设置 s2.name = ‘temp’ s3为变量名称
index.name Series对象索引名设置 s2.index.name = ‘year’ s2为变量名称
head 取到Series的前N行 s2.head(3) 默认选择前5行
tail 取到Series的后N行 s2.tail(2) 默认选择后5行
T DataFrame行与列进行转置 pd5.T pd5为变量名
add,radd Series或DataFrame加法运算(+) s1.add(s2) 与s1+s2效果一致,可通过设置fill_value填充NaN值,例如:fill_value=https://www.it610.com/article/0填充值为0,字母r开头表示会翻转参数
sub,rsub Series或DataFrame减法(-) df1.sub(s4,axis=‘index’) 置axis='index’参数后DataFrame沿着列进行广播执行对应操作(axis='index’等价于axis=0)
div,rdiv Series或DataFrame除法(/) df1.rdiv(1) 1/df1 与 df1.rdiv(1) 等价
floordiv,rfloordiv Series或DataFrame整除(//)
mul,rmul Series或DataFrame乘法(*)
pow,rpow Series或DataFrame幂次方(**)
apply 通过apply将函数应用到列或者行 df.apply(f) f = lambda x:x.max() 默认axis=0(列),f为查找最大值的函数
applymap 将函数应用到每个数据(具体到每个数据) df.applymap(f2) f2 = lambda x:’%.2f’%x f2为保留两位小数的函数
map 利用函数/映射进行数据转换或重命名轴索引 data[‘food’].map(lambda x:meat[x.lower()]) 详情可看数据转换看9.2.2节,重命名轴索引看9.2.4节
sort_index Series或DataFrame索引排序 s1.sort_index() 默认升序排序 指定降序排序 ascending=False,DataFrame默认行升序排序(按照列排序 设置axis=1)
sort_values Series或DataFrame按值排序 s1.sort_values(ascending=False) 根据值的大小进行排序(默认升序),当有缺失值(NaN)默认排最后,DataFrame排序时用by参数指定列,例如:pd2.sort_values(by=‘b’)
unique Series查询唯一值 s1.unique() 返回一个数组 Series中的唯一值 效果类似于SQL中的去重操作
index.is_unique Series判断是否包含重复索引 s1.index.is_unique 判断Series的索引是否是唯一值(是否包含重复索引) 返回True或False
value_counts Series计算每个值出现的个数 ss1.value_counts() 返回一个Series
isin Series或DataFrame判断值是否存在 判断一个值:ss1.isin([8]),判断多个值:data.isin([2,4]) 返回布尔类型
dropna DataFrame丢弃缺失数据 df3.dropna(axis = 1) 默认丢弃出现NaN的行,设置axis=1表示丢弃列,how=‘all’(丢弃全为NaN的行或列),thresh=2(删除存在两个缺失值NaN的行或列)
fillna DataFrame用指定值或插值方法(如ffill或bfill)填充缺失数据 示例一:df3.fillna(-1.) 示例二:df.fillna({1:0.9,2:0}) 示例一:所有NaN的数据都改为-1.0 示例二:第一列出现的缺失值替换为0.9 第二列出现的缺失值替换为0 ; inplace参数对源数据进行修改 默认为False;method指定插值为ffill或bfill
swaplevel 层级索引-交换索引 s1.swaplevel() swaplevel()交换内层和外层的索引
sortlevel 层级索引-排序 s1.sortlevel() sortlevel() 先对外层索引进行排序 再对内层索引进行排序 默认升序
duplicated DataFrame检查是否存在重复值 返回值为布尔值的Series data.duplicated() 默认是保留第一个
drop_duplicates DataFrame删除重复 data.drop_duplicates() 删除重复数据 默认是保留第一个;可以指定列,例如:data.drop_duplicates([‘k2’]);参数keep='last’设置保留最后一个
replace 替换值 data.replace([-999,-1000],[np.nan,0])或data.replace({-999:np.nan,-1000:0}) 替换data中的-999为NaN,-1000为0
rename 重命名轴索引 data.rename(index={‘TOKY’:‘东京’},columns={‘three’:‘第三年’}) 可设置inplace=True在源数据修改
cut 离散化和面元划分 pd.cut(ages,bins) 详情查看9.2.5节
qcut 离散化和面元划分且使每个阶段的数据量大小相等 pd.qcut(data,4)
take 随机排列一个序列 df.take(sam) df中的数据根据sam(新顺序数组)重新排列
sample 随机选择一个序列 df.sample(n=3) 随机选择三行,可设置参数replace=True表示重复选择
set_index 指定列转换为层次化索引 frame2 = frame.set_index([‘c’,‘d’]) 默认删除指定列,可根据设置drop=False不删除指定列
reset_index 消除层级索引 frame2.reset_index()
merge 数据连接 pd.merge(left,right) 根据单个或多个键将不同的DataFrame的行连接起来,类似数据库的连接操作,参数详情可查阅10.2.1 pd.merge
join 数据合并 left2.join(right2,how=‘outer’) 使用join进行索引连接,要求没有重叠的列名,示例效果与pd.merge(left2,right2,how=‘outer’,left_index=True,right_index=True)一致
concat 沿着轴方向将多个对象合并到一起 pd.concat([df1,df2]) 默认外连接 axis=0
stack 将列索引旋转为行索引,完成层级索引(DataFrame -> Series) data.stack() stack将列索引旋转为行索引,完成层级索引
unstack 将层级索引展开 r.unstack() 默认操作内层索引(即level=-1),可通过设置level指定操作索引的级别
pivot 轴向旋转 df3.pivot(‘date’,‘class’,‘values’)
4. Pandas常用统计函数 补充:
统计函数参数:axis=0按列统计(默认),axis=1按行统计;skipna排除缺失值,默认为True
使用方式:Series/DataFrame对象名.统计函数(参数)
方法 说明
count 非NA值的数量
describe 针对Series或各DataFrame列计算汇总统计
min、max 计算最大值和最小值
argmin、argmax 计算能够获取到最小值和最大值的索引位置(整数)
idxmin、idxmax 计算能够获取到最小值和最大值的索引值
quantile 计算样本的分位数(0到1)
sum 值的总和
mean 值的平均数
median 值的算术中位数(50%分位数)
mad 根据平均值计算平均绝对离差
var 样本值的方差
std 样本值的标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的偏度(四阶矩)
cumsum 样本值的累计和
cummin、cummax 样本值的累计最大值和累积最小值
cumprod 样本值的累计积
diff 计算一阶差分(对时间序列很有用)
pct_change 计算百分数变化
5. Pandas读取与存储
  1. 写文件:to_csv函数
    示例:
#将df2中的数据写入csv文件中 df2.to_csv('out_ex1.csv')

  1. 读取文件函数
    使用方法:pd.函数名(参数)
函数 说明
read_csv 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号
read_table 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(’\t’)
read_fwf 读取定宽列格式数据(也就是说。没有分隔符)
read_clipboard 读取剪贴板中的数据,可以看做read_table的剪贴板版。再将网页转换为表格时很有用
read_excel 从 Exeel XLS或XLSX file读取表格教据
read_hdf 读取pandas写的HDFS文件
read_html 读取HTML文档中的所有表格
read_json 读取JSON字符串中的数据
read_msgpack 二进制格式编码的pandas数据
read_pickle 读取Pythom pickle格式中存储的任意对象
read_sas 读取存储于SAS系统自定义存储格式的SAS数据集
read_sql (使用SQL Alchemy)读取SQL查询结果为 pandas的 DataFrame
read_stata 读取 Stata 文件格式的教据集
读取文件函数中参数说明:
参数 说明
path 表示文件系统位置、url、文件型对象的字符串
sep或delimiter 用于对行中各字段进行拆分的字符序列或正则表达式
header 用作列名的行号。默认为0(第一行),如果没有header行就应该设置为None
index_col 用作行索引的列编号或列名。可以是单个名称/数字或由多个名称/数字组成的列表(层次化索引)
names 用于结果的列名列表,结合header=None
skiprows 需要忽略的行数(从文件开始出算起),或需要跳过的行号列表(从0开始)
na_values 一组用于替换NA的值
comment 用于将注释信息从行尾拆分出去的字符
parse_dates 尝试将数据解析为日期,默认为False。如果为True,则尝试解析所有列。此外,还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元祖,就会将多个列组合到一起再进行日期解析工作(例如,日期/时间分别位于两个列中)
keep_date_col 如果连接多列解析日期,则保持参与连接的列。默认为False
converters 由列号/列名跟函数之间的映射关系组成的字典。例如,{‘foo’:f}会对foo列的所有值应用函数f
dayfirst 当解析有歧义的日期时,将其看做国际格式(例如,7/6/2012->June,7,2012)。默认为False
day_parser 用于解析日期的函数
nrows 需要读取的行数(从文件开始处算起)
iterator 返回一个TextParser以便逐块读取文件
chunksize 文件块的大小(用于迭代)
skip_footer 需要忽略的行数(从文件末尾处算起)
补充:
分块读取大文件的方式:
#读取五行 #方式一 agg1 = pd.read_csv(r'agg_match_stats_1.csv',chunksize=10) agg1.get_chunk() #方式二 agg1 = pd.read_csv(r'agg_match_stats_1.csv',iterator=True) agg1.get_chunk(5)

6. JSON库与Pandas库转化
方式 示例 备注
loads json.loads(obj) 将json字符串转换为python形式
dumps json.dumps(res) 将python对象转化为json格式
补充:
读取python形式对象中某个参数的值:pd.DataFrame(res[‘siblings’],columns=[‘name’,‘age’])
7. Pandas数据分组与聚合
函数名 说明
groupby 分组
count 聚合-分组中非NA值的数量
sum 聚合-非NA值的和
mean 聚合-非NA值的平均值
median 聚合-非NA值的中位数
std,var 聚合-标准差和方差
min,max 聚合-非NA值的最小值,最大值
prod 聚合-非NA值的乘积
first,last 聚合-非NA值的第一个,最后一个
【数据分析|Pandas库函数总结】说明:
#对df1根据fruit属性分组 g = df1.groupby(by='fruit') #选取任意数据块 示例:选取apple块 dict(list(df1.groupby(by='fruit')))['apple'] #根据水果求价格平均值 返回Series对象 df1.groupby(by='fruit')['price'].mean() #语法糖 返回Series对象 结果与上条语句一致 df1['price'].groupby(df1['fruit']).mean() #as_index=False显示索引项 df1.groupby(by='fruit',as_index=False)['price'].mean() df1.groupby(by='fruit',as_index=False)['price'].mean() #自定义聚合函数 #计算每一种水果的差值 def diff(arr): return arr.max()-arr.min() #agg或aggregate df1.groupby(by='fruit')['price'].agg(diff) #多个分组条件返回层级索引的Series对象 df1.groupby(by=['fruit','color'])['price'].mean() #另一种写法 df1['price'].groupby(by=[df1['fruit'],df1['color']]).mean() #小技巧:使输出结果为DataFrame对象 #orange yellow 5.6 df1.groupby(by=['fruit','color'])[['price']].mean() df1[['price']].groupby(by=[df1['fruit'],df1['color']]).mean()

    推荐阅读