Pandas
Numpy 基础数据类型,关注数据的结构表达,维度:数据间关系 Pandas 扩展数据类型,关注数据的应用表达,维度:数据与索引间关系
基础
匿名函数与map方法
my_func = lambda x: 2*x
my_func(3)
[(lambda x: 2*x)(i) for i in range(5)]
list(map(lambda x: 2*x, range(5)))
list(map(lambda x, y: str(x)+'_'+y, range(5), list('abcde')))字典构建
根据列表构建
# L1是key,L2是val
L1, L2, L3 = list('abc'), list('def'), list('hij')
dict(zip(L1, L2))zip
构造df
Series
Series 一般由四个部分组成,分别是序列的值 data 、索引 index 、存储类型 dtype 、序列的名字 name 。其中,索引也可以指定它的名字,默认为空。
object 代表了一种混合类型,正如上面的例子中存储了整数、字符串以及 Python 的字典数据结构。此外,目前 pandas 把纯字符串序列也默认认为是一种 object 类型的序列,但它也可以用 string 类型存储
对于这些属性,可以通过 . 的方式来获取:
DataFrame
DataFrame 在 Series 的基础上增加了列索引,一个数据框可以由二维的 data 与行列索引来构造:
但一般而言,更多的时候会采用从列索引名到数据的映射来构造数据框,同时再加上行索引:
由于这种映射关系,在 DataFrame 中可以用 [col_name] 与 [col_list] 来取出相应的列与由多个列组成的表,结果分别为 Series 和 DataFrame
与 Series 类似,在数据框中同样可以取出相应的属性:
转置
常用基本函数
特征统计函数
在 Series 和 DataFrame 上定义了许多统计函数,最常见的是 sum, mean, median, var, std, max, min 。
df_demo.mean()
此外,需要介绍的是 quantile, count, idxmax,idxmin 这三个函数,它们分别返回的是分位数、非缺失值个数、最大值对应的索引
df_demo.quantile(0.75)
上面这些所有的函数,由于操作后返回的是标量,所以又称为聚合函数,它们有一个公共参数 axis ,默认为0代表逐列聚合,如果设置为1则表示逐行聚合。
唯一值函数
对序列使用 unique 和 nunique 可以分别得到其唯一值组成的列表和唯一值的个数
value_counts 可以得到唯一值和其对应出现的频数
如果想要观察多个列组合的唯一值,可以使用 drop_duplicates 。其中的关键参数是 keep ,默认值 first 表示每个组合保留第一次出现的所在行, last 表示保留最后一次出现的所在行, False 表示把所有重复组合所在的行剔除。
此外, duplicated 和 drop_duplicates 的功能类似,但前者返回了是否为唯一值的布尔列表,其 keep 参数与后者一致。其返回的序列,把重复元素设为 True ,否则为 False 。 drop_duplicates 等价于把 duplicated 为 True 的对应行剔除。
替换函数
在 replace 中,可以通过字典构造,或者传入两个列表来进行替换:
另外, replace 还有一种特殊的方向替换,指定 method 参数为 ffill 则为用前面一个最近的未被替换的值进行替换, bfill 则使用后面最近的未被替换的值进行替换。
逻辑替换包括了 where 和 mask ,这两个函数是完全对称的: where 函数在传入条件为 False 的对应行进行替换,而 mask 在传入条件为 True 的对应行进行替换,当不指定替换值时,替换为缺失值。
需要注意的是,传入的条件只需是与被调用的 Series 索引一致的布尔序列即可:
数值替换包含了 round, abs, clip 方法,它们分别表示按照给定精度四舍五入、取绝对值和截断:
排序函数
排序共有两种方式,其一为值排序,其二为索引排序,对应的函数是 sort_values 和 sort_index 。
df_demo.sort_values(['Weight','Height'],ascending=[True,False]).head()
索引排序的用法和值排序完全一致,只不过元素的值在索引中,此时需要指定索引层的名字或者层号,用参数 level 表示。另外,需要注意的是字符串的排列顺序由字母顺序决定。
```df_demo.sort_index(level=['Grade','Name'],ascending=[True,False]).head()`
apply方法
得益于传入自定义函数的处理,
apply的自由度很高,但这是以性能为代价的。一般而言,使用pandas的内置函数处理和apply来处理同一个任务,其速度会相差较多,因此只有在确实存在自定义需求的情境下才考虑使用apply。
窗口对象
pandas 中有3类窗口,分别是滑动窗口 rolling 、扩张窗口 expanding 以及指数加权窗口 ewm 。
要使用滑窗函数,就必须先要对一个序列使用 .rolling 得到滑窗对象,其最重要的参数为窗口大小 window 。
在得到了滑窗对象后,能够使用相应的聚合函数进行计算,需要注意的是窗口包含当前行所在的元素,例如在第四个位置进行均值运算时,应当计算(2+3+4)/3,而不是(1+2+3)/3:
对于滑动相关系数或滑动协方差的计算,可以如下写出:
此外,还支持使用 apply 传入自定义函数,其传入值是对应窗口的 Series ,例如上述的均值函数可以等效表示:
shift, diff, pct_change 是一组类滑窗函数,它们的公共参数为 periods=n ,默认为1,分别表示取向前第 n 个元素的值、与向前第 n 个元素做差(与 Numpy 中不同,后者表示 n 阶差分)、与向前第 n 个元素相比计算增长率。这里的 n 可以为负,表示反方向的类似操作。
将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1 的 rolling 方法等价代替:
扩张窗口又称累计窗口,可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。具体地说,设序列为a1, a2, a3, a4,则其每个位置对应的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]。
常见应用
groupby之后写入文件
如何把DataFrame中以list类型存放的单元进行纵向展开?一行变多行
df.explode('value', ignore_index=True)
https://www.cnblogs.com/traditional/p/11967360.html
嵌套的字典转DataFrame
https://blog.csdn.net/sinat_26811377/article/details/100065580
新的列是groupby后再sum
df['Total Amount'] = df.groupby('Id', sort=False)["Amount"].transform('sum')
df append
新建一个df,然后df2 = df2.append(newdf2, ignore_index=True)
两列转字典
item.set_index('item_id')['item_category'].to_dict()
[('a', 'd', 'h'), ('b', 'e', 'i'), ('c', 'f', 'j')]
[('a', 'b', 'c'), ('d', 'e', 'f'), ('h', 'i', 'j')]
索引排序的用法和值排序完全一致,只不过元素的值在索引中,此时需要指定索引层的名字或者层号,用参数 level 表示。另外,需要注意的是字符串的排列顺序由字母顺序决定。
In [103]: roller.apply(lambda x:x.mean()) Out[103]: 0 NaN 1 NaN 2 2.0 3 3.0 4 4.0 dtype: float64
历史笔记
Series类型
Series类型由一组数据及与之相关的数据索引组成 创建Series:
Python列表,index与列表元素个数一致 b = pd.Series([9,8,7,6],index=['a','b','c','d'])
标量值,index表达Series类型的尺寸 s = pd.Series(25, index=['a','b','c'])
Python字典,键值对中的"键"是索引,index从字典中进行选择操作 e = pd.Series({'a':9,'b':8,'c':7},index=['c','a','b','d'])
ndarray,索引和数据都可以通过ndarray类型创建 m = pd.Series(np.arange(5), index=np.arange(9,4,-1))
其他函数,range()函数等
Series类型包括index和values两部分 b[['c','d','a']]
Series类型的操作类似ndarray类型
索引方法相同,采用[]
NumPy中运算和操作可用于Series类型
可以通过自定义索引的列表进行切片
可以通过自动索引进行切片,如果存在自定义索引,则一同被切片
Series类型的操作类似Python字典类型
通过自定义索引访问
保留字in操作
使用.get()方法 b.get('f',100)
Series+Series Series类型在运算中会自动对齐不同索引的数据
Series对象和索引都可以有一个名字,存储在属性.name中
DataFrame类型
DataFrame类型由共用相同索引的一组列组成
创建DataFrame:
二维ndarray对象 d = pd.DataFrame(np.arange(10).reshape(2,5))
由一维ndarray、列表、字典、元组或Series构成的字典
Series类型
其他的DataFrame类型
索引操作
修改索引
数据的获取
如果通过索引标签获取数据的话,末端标签所对应的值是可以返回的
.sort_index()方法在指定轴上根据索引进行排序,默认升序 .sort_index(axis=0, ascending=True)
增加或重排:重新索引 .reindex()能够改变或重排Series和DataFrame索引 .reindex(index=None, columns=None, …)的参数 index, columns 新的行列自定义索引 fill_value 重新索引中,用于填充缺失位置的值 method 填充方法, ffill当前值向前填充,bfill向后填充 limit 最大填充量 copy 默认True,生成新的对象,False时,新旧相等不复制 newc = d.columns.insert(4,'新增') newd = d.reindex(columns=newc,fill_value=200)
Series和DataFrame的索引是Index类型 Index对象是不可修改类型
索引类型的常用方法 .append(idx) 连接另一个Index对象,产生新的Index对象 .diff(idx) 计算差集,产生新的Index对象 .intersection(idx) 计算交集 .union(idx) 计算并集 .delete(loc) 删除loc位置处的元素 .insert(loc,e) 在loc位置增加一个元素e
删除:drop .drop()能够删除Series和DataFrame指定行或列索引
###查询数据
查询指定的行
查询指定的列
也可以通过ix索引标签查询指定的列
查询指定的行和列
条件查询
统计分析
累计统计分析函数 适用于Series和DataFrame类型,累计计算 .cumsum() 依次给出前1、2、…、n个数的和 .cumprod() 依次给出前1、2、…、n个数的积 .cummax() 依次给出前1、2、…、n个数的最大值 .cummin() 依次给出前1、2、…、n个数的最小值
适用于Series和DataFrame类型,滚动计算(窗口计算) .rolling(w).sum() 依次计算相邻w个元素的和 .rolling(w).mean() 依次计算相邻w个元素的算术平均值 .rolling(w).var() 依次计算相邻w个元素的方差 .rolling(w).std() 依次计算相邻w个元素的标准差 .rolling(w).min() .max() 依次计算相邻w个元素的最小值和最大值
类似于SQL的操作
表的Union,会自动对齐列,在原始数据student下新增student2的数据行
新增一列,这里Score是新增的列,没有赋值,是NaN
删除表、观测行或变量行
修改原始记录的值
数据聚合
排序
多表连接
左连接实现的是保留student表中的所有信息,同时将score表的信息与之配对,能配多少配多少,对于没有配上的Name,将会显示成绩为NaN
只想要b列值为5和13的行
如果想要除了这两行以外的数据呢?
原理是先把b取出来准换为列表,然后再从列表中把不需要的行(值)去除,然后再在df中使用isin()
缺失值处理
常用的有三大类方法,即删除法、填补法和插值法。 删除法:当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量;当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测。 替补法:对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。 插补法:插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。
数据透视表
pivot_table()
数据类型运算
二维和一维、一维和零维间为广播运算,一维Series默认在轴1参与运算,用axis=0可以令一维Series参与轴0运算 采用+ ‐ * /符号进行的二元运算产生新的对象
方法形式的运算 .add(d, **argws) 类型间加法运算,可选参数 .sub(d, **argws) 类型间减法运算,可选参数 .mul(d, **argws) 类型间乘法运算,可选参数 .div(d, **argws) 类型间除法运算,可选参数
a = pd.DataFrame(np.arange(12).reshape(3,4)) b = pd.DataFrame(np.arange(20).reshape(4,5)) b.add(a,fill_value = 100) a.mul(b,fill_value = 0)
比较运算法则 比较运算只能比较相同索引的元素,不进行补齐 采用> < >= <= == !=等符号进行的二元运算产生布尔对象
遍历
遍历dataframe
类型转换
dataframe转成dict
DataFrame.``to_dict(orient='dict', into=<class 'dict'>)[source]
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html
Last updated
Was this helpful?