-
Notifications
You must be signed in to change notification settings - Fork 0
Pandas
Pandas(panel data)基于Numpy,其主要数据类型为Series和DataFrame,分别为一维和二维数据表,还有Panel类型,用于三维甚至更高维的数据,但很少使用。
import pandas as pd
-
Series
Series是一维的数组型对象,内部嵌套了一个一维的ndarry类型,并含有数据标签index。 分别可以通过values
和index
属性来获取数据值和标签.
此外还有deype
属性表示数据类型,Series.index和Series本身都有有name
属性表示其名称
(交互式环境下索引在左,值在右) $ \ $
Series可以执行numpy中的数组运算,运算会作用在values即其内嵌的ndarray上。 生存Series序列主要有以下几种方法:
- 使用一维ndarray生成Series
# index默认从0开始,也可以自行指定 pd.Series(np.arange(5), index=['a', 'b', 'c', 'd', 'e'])
- 使用列表或元组构建
pd.Series([1,2,3,...]) pd.Series((4,5,6,...))
- 使用字典构建
$$ 键 \rightarrow index \ 值 \rightarrow values $$pd.Series({},index=...)
若修改index后,多出的index对应的值为NaN,缺少的index及其对应的值会消失
- 使用DataFrame类型中的某一列构建
将DataFrame中的一列提取出来就是一个Series类型。frame[column]
这样取后原来的column列索引就是获得的Series的name,原来的index也就是之后Series的index。
若要检查Series的缺失值,可以使用isnull()
和notnull()
函数,返回一个对应的布尔数组型的Series
-
DataFrame
DataFrame为二维数据,行和列分别有索引'index'和'columns',他们都有name
属性,但不同于Series其本身并没有name
属性。DataFrame也有dtype
属性,values
为一个二维的ndarray类型。pd.DataFrame(data=2d_array, index=[行索引], columns=[列索引], dtype='...')
- 列: 通过
frame[column]
或frame.column
都可以获取列,但后则只有在列名为python变量名时才有效,前者还可以用来添加一列。 若要删除列,可以使用del
语句del frame[column] - 行: 行可以通过位置特殊属性
loc
进行选取 此外,还可以对行列进行转置frame.T
,index将会和column交换
- 列: 通过
-
Index
Index为索引对象,Series和DataFrame都有索引对象,但不一定就是Index,还可能为RangeIndex Int64Index等多种形式,但他们都是索引类型。一些索引对象的方法 描述 append 将额外索引粘贴到原索引,产生一个新索引 difference 两个索引的差集 intersection 交集 union 并集 isin 每个值是否在传入容器中 delete 将i位置元素删除,产生新索引 drop 删除指定的元素,产生新索引 insert 在i位置插入元素,产生新索引 is_monotonic 是否递增 is_unique 索引是否唯一 unique 去除重复索引
-
重建索引
DataFrame.reindex()函数可以重建索引DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
reindex方法的参数
参数 描述 index 可以为索引类型或者py其他数据结构,替换index(新的index的值不会继承原来位置的值,默认为Nan) columns 替换columns索引 method 'fill'向前填充, 'bfill'向后填充(对str类型没有用,str类型无法比大小) fill_value 用于填充Nan limit 向前后填充时填充的最大行数 copy True总是复制底层数据 -
删除行列
pd.drop([], axis=0/1, inplace=True)
axis: 删除指定的index行或columns列
inplace: 表示是否改变原对象 -
选择数据
使用loc和iloc选择数据# 使用索引名选取数据 DataFrame.loc[[index], [columns]] # 按索引顺序选取数据 DataFrame.iloc[[index_number], [columns_number]]
下面是DataFrame索引选项表
类型 描述 df[val] 访问列 df.loc[] 访问单或多行 df.iloc[] $\uparrow$ df.loc[:, n] 访问单或多列 df.iloc[:, n] $\uparrow$ df.at[label_i, label_j ] 根据行列访问单个元素 df.iat[label_i, label_j ] $\uparrow$ get_value set_value 根据行和列设置单个值
Series或DataFrame相加时会对索引做并集,唯一的索引值变成NaN。只有索引相同的元素才会进行运算
算术方法 | 描述 |
---|---|
add, radd | + |
sub, rsub | - |
div, rdiv | / |
floordiv, rfoordiv | // |
mul, rmul | * |
pow, rpow | ** |
可选参数: fill_value,用于填充NaN值
-
广播
- DataFrame减去或加上一个同列数的Sereis是,会将操作广播到每一行,即对每一行加减Series。
- Series中的索引会与列索引进行匹配,若有多的索引运算后的值为NaN。
- 若要对行进行批评,广播到列,可修改参数
axis=1
-
重复索引 索引可以有重复的值,使用这种索引时会返回所有该索引对应的值,可以使用
is_unique
属性判断索引是否唯一Index.is_unique
使用函数映射时Numpy中的通用函数对Pandas对象同样有效
-
apply函数
DataFrame.apply(function)
可选参数: axis = 0/1
函数也可以自定义
function = lambda x: x.min() - x.max() # 默认对每一列进行操作 df.apply(function)
-
applymap和map
也可以applymap函数进行逐元素操作format = lambda x: '%2f" % x # 转换每个元素的格式 df.applymap(format)
applymap是对DataFrame进行操作,若要对Series的每个元素进行操作,可以使用map方法
df.iloc[0].map(format)
-
sort_index 对索引排序
sort_index可以对单个字母或数值类型索引进行排序DataFrame.sort_index(axis = 0/1, ascending=True/False)
axis: 指定索引轴
ascending: 是否升序 -
sort_values 对值排序
默认情况下缺失值会被排序在Series的尾部Series.sort_values() DataFrame.sort_values(by = [columns])
by: 参数用于指定列
-
rank 排名
排名是将数据排序后,给数据分配一个名次,就像班级成绩的第几名一样Series.rank(method = ..., ascending = False/True) DataFrame.rank(axis = 0/1)
axis=0是匹配行,对列进行排名;下面method参数的选项
平级关系的方法 描述 'average' 进行平均排名,相同数据会用平均数(默认) 'min' 最小排名,相同数据用小的那个(例如两个第二名,没有第三名,直接到第四名) 'max' 最大排名,相同数据用大的那个 'first' 相同按数据出现次序排名 'dense' 类似min,但名次不会间断(例如两个第二名,下一个是第三名)
-
规约方法
sum()
和mean()
这类方法属于规约型方法,规约方法的可选参数如下方法 描述 axis 0行向 1列向 skipna 排除缺失值 level 用于多层索引 除了归约型还有累计型的方法,例如
cumsum()
,下面是一些常用的统计性方法的汇总方法 描述 count 非NA的个数 describe 计算各种信息的汇总集合 min max 计算最值 argmin argmax 计算最值索引位置 idxmin idxmax 最值下表 quantile 计算样本0~1之间的分位数 sum 加和 mean 均值 median 中位数 mad 平均值的平均绝对方差 prod 所有值的积 var 方差 std 标准差 skew 样本偏度(第三时刻) kurt 样本峰度(第四时刻) cumsum 累计值 cummin cummax 累积值的最大、最小值 cumpord 累计积 diff 第一个算术差值(时间序列) pct_change 计算百分比 corr 返回相关性矩阵 cov 返回协方差矩阵 corriwth DataFrame中的行或列对Series的相关性 前面给出了获得index唯一值的方法,要获得Series的唯一值可以使用
unique
方法,唯一值不会被排序,可以使用uniques.sort()
,相应的,value_counts
计算Series每个值的数量。isin
对Series或DataFrame一列的数据进行检查,判断是否包含在参数中。相关的有Index.get_indexer
方法,即对索引进行value_counts操作。Series.isin(['b', 'c']) # 返回bool值列表 Index.get_indexer(['a', 'b'])
-
文本数据的读写
pandas最常用的就是read_csv
和read_table
函数,下面是常用函数表函数 描述 read_csv 从文件 URL或文件类型对象读取有分隔的数据(默认,) read_table 从文件 URL或文件类型对象读取有分隔的数据(默认\t) read_fwf 从特定宽度格式文件读取数据(无分隔符) read_clipboard 同read_table,但是从剪贴板读取 read_excel 从Excel的xls或xlsx文件读取表格数据 read_hdf 读取pandas存储的HDF5文件 read_html 从HTML文件读取表格数据 read_json 从JSON字符串读取数据 read_msgpack 读取MessagePack二进制格式的pandas数据 read_pickle 读取python pickle格式存储的对象 read_asa 读取SAS系统中定制存储格式的SAS数据集 read_sql 将SQL查询结果读取为pandas的DataFrame read_stata 读取Stata格式数据集 read_feather 读取Feather二进制格式 -
read_csv read_table函数
pandas.read_csv('file_name', sep=',', header=None, names=[], index_col=[], na_values=['NULL'])
参数:
sep: 指定分隔符(默认csv就是逗号分隔的文本文件)
header: 默认第一行为列名, None自动分配整数列名, 也可以指定某一行为列名
names: 自己指定列名
index_col: 选取某一列为index,默认index为0开始的整数(若要使用分层索引,则传入列表)
na_values: 指定缺失值,也可以传入一个字典{'columns':['values']}来分别指定每列的补充值参数 描述 path 文件路径、URL、文件对象 spe 或 delimiter 可以是分隔符或正则表达式 header 作为列名的行号(默认0,第一行为列名),None则为整数列名 index_col 作为index的列名,默认index为0开始的整数(若要使用分层索引,则传入列表) names 指定列名列表,header=None一起用 skiprows 跳过的行号列表 skip_footer 跳过文件尾部的行数 keip_blank_lines 是否跳过空白行(默认True) na_values 用于替换NA值的值 comment 注释字符 parase_dates 尝试将数据解析为datetime,默认False nrows 读入前n行 parse_dates 若为True,则尝试解析数据框中的行索引。列表会被解析为日期列;嵌套列表会将某些列合并为日期列;字典会解析key对应的列为日期 chunksize 用于迭代块的大小 encoding Unicode文本编码 squeeze 如果只有一行,返回Series thousands 千位分隔符
-
-
分块读入文本文件
在读取大文件时,可以调整pandas的显示
pd.options.display.max_rows = 10
为了分块读取文件,可以指定chunksize
作为每一块的行数chunker = pd.read_csv('file.csv', chunksize=1000)
read_csv返回的TextParse对象允许根据chunksize遍历文件
tot = pd.Series([]) for piece in chunker: tot = tot.add(piece['key'].value_counts(), fill_values=0) tot = tot.sort_values(sacending=False)
-
将数据写入文本格式
DataFrame.to_csv('file_name', spe='|', na_rep='NULL', index=False, header=False, columns=[])
参数:
若传入文件名,则保持到文件,也可以使用sys.stdout重定向输入到终端
spe: 定义分隔符
na_rep: 填充NaN值
index: 是否写入索引
header: 是否写入columns列索引
colmuns: 根据列名列表,选择性写入某些列 -
读取HDF5格式文件
HDF5是一个用于存储大量科学数组数据的文件格式,以C库的形式提供,并有许多其他语言的接口,例如Java、Julia、MATAB和Python。HDF代表分层数据格式,HDF5支持多种压缩模式的及时压缩,并使用于处理无法读入内存的超大型数据。 -
读取Excel文件
xlsx = pd.ExcelFile('file.xlsx') pd.read_excel(xlsx, 'Sheet1') # 或 pd.read_excel('file.xlsx', 'Sheet1')
将pandas数据写入Excel数据中,必须先生成一个ExcelWriter,然后使用to_excel方法写入
writer = pd.ExcelWriter('example.xlsx') DataFrame.to_excel(wirter, 'Sheet1') writer.save() # 或 pd.to_excel('example.xlsx')
NA处理方法 | 描述 |
---|---|
dropna | 去除缺失值所在行列 |
fillna | 填充缺失值 或 使用插值方法(例如'ffill' 'bfill') |
isnull | 是否为缺失值的布尔值 |
notnull | 与isnull相反 |
-
过滤缺失值
使用dropna函数删除带有NA值的行DataFrame.dropna(how='all', axis=0/1)
参数
how
为all会去掉全为NA的行,若要对列操作使用axis参数即可 -
填充缺失值
fillna用于填充缺失值DataFrame.fillna(0, inplace=False)
fillna默认会返回一个新对象,而不是直接替代原对象,可以使用
inplace=True
直接填充原对象。除了填入单个值,也可以传入一个字典以对不同列设定不同的填充值。fillna参数 描述 value 标量值或字典型对象用于填充缺失值 method 插值方法,默认'ffill' axis 选取作用的轴,默认为0 inplace 修改调用的对象,而不是生成一个备份 limit 限制向前后填充的最大范围
-
删除重复值
DataFrame.duplicated() DataFrame.drop_duplicated(['k1', 'k2'], keep='last')
DataFrame.duplicated
返回一个布尔值Series,反应每行是否重复(True)
DataFrame.drop_duplicated
去除重复行后返回DataFrame,也可以传入列名列表,根据某些列判断是否重复并去除重复行。 以上方法都保留第一次出现的值,使用参数keep='last' 保留最后重复出现的值。 -
使用函数或映射进行数据转换
-
替代值
replace
提供了更加直观的替换的特殊方法DataFrame.replace(a, b)
这里将a替换成b,a可以为单个值,也可以是单个列表,将列表中值都替换为b