import Pandas as pd
import json
补充:
(1) Series与DataFrame可以直接使用numpy的函数,例如np.abs(df):对DataFrame的数据取绝对值
(2) 处理JSON数据时需要引入JSON库
方式 | 示例 | 备注 |
---|---|---|
通过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参数指定索引
方式 | 示例 | 备注 |
---|---|---|
字典类 | 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指定列索引
函数名 | 说明 | 示例使用 | 备注 |
---|---|---|---|
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表示重复选择 |
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’) |
补充:
统计函数参数: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 | 计算百分数变化 |
#将df2中的数据写入csv文件中
df2.to_csv('out_ex1.csv')
函数 | 说明 |
---|---|
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)
方式 | 示例 | 备注 |
---|---|---|
loads | json.loads(obj) | 将json字符串转换为python形式 |
dumps | json.dumps(res) | 将python对象转化为json格式 |
补充:
读取python形式对象中某个参数的值:pd.DataFrame(res[‘siblings’],columns=[‘name’,‘age’])
函数名 | 说明 |
---|---|
groupby | 分组 |
count | 聚合-分组中非NA值的数量 |
sum | 聚合-非NA值的和 |
mean | 聚合-非NA值的平均值 |
median | 聚合-非NA值的中位数 |
std,var | 聚合-标准差和方差 |
min,max | 聚合-非NA值的最小值,最大值 |
prod | 聚合-非NA值的乘积 |
first,last | 聚合-非NA值的第一个,最后一个 |
说明:
#对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()