开发环境
pycharm 专业版(2019.1.3)
python 3.7
ipython 7.8.0
上一小节中讲解了Serise数组: Series数组学习
DataFrame数组相当于就是一个pandas中的Series容器,当进行某些操作时,DataFrame数组就能够变为Series数组了。
pandas中DataFrame数组的创建
首先导入包
import pandas as pd
import numpy as np
如果没有,就在cmd中输入一下命令
创建DataFrame数组
- DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横项索引,叫index, 0轴,axis=0
列索引,表明不同列,纵项索引,叫columns, 1轴,axis=1
# 创建一个3行四列的DataFrame数组, 并指定DataFrame的行索引和列索引
d1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("ABC"), columns=list("WXYZ"))
这样就完成了一个DataFrame数组的创建了
其实在DataFrame中不仅仅只能传列表,也可以传入字典作为参数传入到DataFrame中
还能够在列表中嵌套字典传入, 缺失的值会自动使用NaN进行代替
# 在DataFrame中传入字典作为参数 ==> 列表中嵌套字典,缺失值显示为nan
t3 = [{"name": "xiaoming", "age": 18, "tel": 10085}, {"name": "xiaohong", "age": 16}, {"name": "xiaogang", "tel": 10010}]
# index 为行索引, columns为列索引, 指定d3的行索引
d3 = pd.DataFrame(t3, index=list("ABC"))
DataFrame的描述信息
首先创建一个DataFrame数组为df
DataFrame的基础属性
df.shape # 行数,形状
df.dtypes # 列数据的类型
df.ndim # 数据维度
df.index # 行索引
df.columns # 列索引
df.values # 对象值, 二维ndarray数组
DataFrame整体情况查询
df.head(2) # 显示头部几行, 默认为5行
df.tail(2) # 显示末尾几行, 默认为5行
df.info() # 相关信息概念:行数、列数、行索引、列索引非空值个数、行类型、列类型和内存占用
df.describe() # 快速综合统计结果: 计数、均值、标准差、最大值、四分位数、最小值
DataFrame中的排序方法, 默认为升序排序,by指定排序字段
# 创建DataFrame数组
t1 = [{"name": "xiaoming", "age": 18, "tel": 10085}, {"name": "xiaohong", "age": 16, "tel": 10013}, {"name": "xiaogang", "age": 29, "tel": 10010}]
d1 = pd.Dataframe(t1)
在DataFrame数组中有一个按照值进行排序的方法,sort_values(),参数by为指定排序字段,ascending默认为升序排序,当为False时,降序排序
按照age字段进行降序排序
pandas中的索引
首先导入包,创建一个数组
import pandas as pd
import numpy as np
d1 = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list("abc"), columns=list("WXYZ"))
pandas取行或取列的注意点:
- 方括号写数组,表示取行,对行进行操作
- 写字符串,表示取列索引,对列进行操作
pandas中DataFrame数组取行与numpy之间有着一些相似之处,所以这里就据几个简单的例子,不一一赘述了
取在W这一列的前两行数据
取前两行数据
还有两种为pandas之loc与iloc - df.loc: 通过标签索引行数据
- df.iloc: 通过位置获取行数据
loc时通过标签索引来获取 数据的,那什么时标签呢?其实就是我们的index(行索引)与columns(列索引)所对应的值。
比如:
用loc取d1中行索引标签为“a”, 列索引标签为“w”的值
用iloc来获取数据,就是使用索引下标的方法,用数字取值
用iloc取d1中行索引标签为“a”, 列索引标签为“w”的值
赋值更改数据
更改数据很简单,只需要将值选取出来,然后赋值给它就可以了
将行索引为“a”,列索引为“W”的值修改为10
这样即可完成修改
bool索引和缺失数据的处理
现在我们有一个DataFrame数组d3是这样的
下面有一个小需求,取"W"这一列中大于0小于8的数组
或许我们会使用这种方法来取值
但是这种方法是不可取的,在pandas中要执行多条件,听该使用”&“符号和”|“符号,并且不同的条件之间需要用小括号括起来
pandas之布尔索引:
& ==> 且
| ==> 或
注意点: 不同的条件之间需要用括号括起来
t2 = {"dog_name": ["duke", "max", "lucky", "boys", "friday", "monday"],
"dog_count": [5, 9, 13, 4, 6, 9]}
d2 = pd.DataFrame(t2)
# 查找使用次数超过5,并且字符串长度大于4的狗的名字, str是将数据转化为字符串的方法
result = d2["dog_name"][(d2["dog_name"].str.len() > 4) & (d2["dog_count"] >= 5)]
缺失数据的处理
对于nan的数据,在numpy中我们是如何处理的
在pandas中我们处理起来非常容易
在pandas中判断数据为nan, pd.isnull(d1), pd.notnull(d1)
pd.isnull()方法会查看数组中哪些值是nan,以bool值形式类型返回,而pd.notnull()则与pd.isnull相反
pd.notnull()查看哪些值不是nan
处理方式1: 删除NaN所在的行列,dropna(axis=0, how=“any”,inplace = False) # any代表有nan的行都会被删除,除了any之外,还有all,all表示一行中全为nan才会被删除, inplace 表示是否进行替换
当参数how="any"时,如横轴上有nan,那么这一行被删除
当how="all"时,横轴上所有的值为NaN才进行删除
参数inplace表示是否进行替换, 类似于d1 = d1.dropna(axis=0,how=“any”)
处理方式2:填充数据,t,fillna(t.mean()), t.fillna(t.median()), t.fillna(0) , 填充均值,填充中值,填充0
填充均值
填充中值
将NaN的值替换为0
处理为0的数据: d3[d3==0] = np.nan
当时并不是每次为0的数据都需要被处理,计算平均值等情况,nan是不参与计算的,但是0会
d3[pd.notnull(d3["W"])] # 选中d3中W这一列没有nan的数组