引入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 = {‘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=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表示重复选择 |
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读取与存储
- 写文件:to_csv函数
示例:
df2.to_csv('out_ex1.csv')
- 读取文件函数
使用方法: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值的第一个,最后一个 |
说明:
g = df1.groupby(by='fruit')
dict(list(df1.groupby(by='fruit')))['apple']
df1.groupby(by='fruit')['price'].mean()
df1['price'].groupby(df1['fruit']).mean()
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()
df1.groupby(by='fruit')['price'].agg(diff)
df1.groupby(by=['fruit','color'])['price'].mean()
df1['price'].groupby(by=[df1['fruit'],df1['color']]).mean()
df1.groupby(by=['fruit','color'])[['price']].mean()
df1[['price']].groupby(by=[df1['fruit'],df1['color']]).mean()
|