建模比赛中有时会遇到海量的数据,不规整的xlsx或者csv文件,或者需要用重复的 *** 作处理批量的表格
这里整理了一些我常用的python数据清洗技巧
字典dict
字典又称为“哈希表hashmap”、“映射”,是一种极其方便的数据结构。
它通过键值对(key-value)的方式进行存储,在开发部门长期的改进与完善后,字典的存储与查找的效率非常的高。
有人戏称,python将世界装进了字典中。
编码时用花括号{}封装起来,键与值之间用“:”分隔;不同的键值对之间用“,”分隔。
age={'Mike':18,'Bob':16} ##键与值的数据类型并没有限制
key_value={10:2,11:3}
infomation={'name':'Rise','age':18,'ID':'B19011318'}
不允许同一个键出现两次。
创建时如果同一个键被赋值两次,后一个值会被记住
访问1. 访问字典的值时,后面加上`[访问的值对应的键]`
如果没有该键值对,则会报错
2. 判断字典中是否有特定键:
```python
flag='name' in infomation
Out:
flag=True
```
“增”
* 增加新的键值对:
```python
infomation["color"]='red'
```
* 将其他字典加入该字典中(update函数):
```python
d={'Name':'Rise','color':'red','age':18}
c={'id':'B19011321'}
d.update(c)
```
“删”
删除已有的元素:
- del函数:
del infomation['name'] #删除该键
del infomation #删除整个字典
infomation.clear() #将字典清空,变为空字典
若调用del
的时候,删除的键值对不存在,则会报错
2. pop函数:
infomation.pop('Name')
“改”
与增加新的键值对的语法一样,但是实现效果不同。
“改”则是更新键值对。
-
返回所有键:
编码为d.keys()
。但返回类型为"dict_keys",可以在
for
循环中遍历,但并不能直接查看。如要查看每一个键值可以在循环中输出,或者将结果保存为列表,即
list_keys=list(d.keys())
-
返回所有值:
编码为d.values()
。但返回类型为"dict_values"。
其余同上
-
返回所有键值对(项):
编码为d.items()
。但返回类型为"dict_items"。
其余同上
-
复制 *** 作
dict_new=dict_old.copy()
如果仅仅是dict_new=dict_old
,当我们修改dict_new
的时候,会发现dict_old
随着dict_new
一起发生了相同的变化。
我们做建模比赛的时候,经常使用智能算法等进行优化,需要创造新解,并且希望新解发生变化的时候旧解保持不变,方便我们将两者进行比较,这时候就不能简单地对字典整体进行赋值(其实对于list、array等数据结构来说也一样不可以)。
按照值进行排序浅拷贝:
从本质来看,对于编译器来说dict_new
这种写法实际上是引用了一个像C语言“指针”一样的东西,在C语言中我们不可以将一个数组整体进行赋值,而需要一个指针来指向这个数组的初始地址。
python的整体赋值其实也是用新变量指向了原变量的初始地址,而对新变量进行修改,改变的还是原空间中存储的数据。
.copy()
相当>于>一次浅拷贝 *** 作,将原来的存储空间和数据复制了一份。
这时对新变量改动就不会影响到原变量了。
使用sorted
函数,并且要结合lambda
表达式,以下为详解:
d = {'zcy':91,'hyz':98,'ly':93,'ssy':96,'pyj':100}
#key=lambda后面随意选取一个变量,这里使用'i',i:i[0]表明第一项,即以字典的“键”进行排序
#默认为升序排列,reverse参数代表是否降序排列,reverse为True代表降序,若为False则为升序排列
c_tuple=sorted(d.items(), key=lambda i:i[1],reverse=False) #键按照升序排列
c_tuple=sorted(d.items(), key=lambda i:i[1],reverse=True) #键按照降序排列
c_tuple=sorted(d.items(), key=lambda i:i[1],reverse=False) #键按照升序排列
c_tuple=sorted(d.items(), key=lambda i:i[1],reverse=True) #键按照降序排列
#调用完sorted函数之后,返回的是一个列表,列表中的元素为元组(键,值)
#如要返回原先的字典形式,则需要
c_sorted_dict=dict(c_tuple)
pandas库
pandas库为 Python 数据分析提供了提供快速、灵活和富有表现力的数据结构,即Series和DataFrame。
旨在使“关系”或“标记”数据的使用既简单又直观。
Pandas 自诞生后被应用于众多的领域,比如金融、统计学、社会科学、建筑工程等。
使用其 *** 作及数据结构之前必须先进行导包 *** 作
import pandas as pd
import numpy as np
Python在使用pandas库的时候,往往也需要用到numpy库,因此在用到numpy的时候也要进行提前导包 *** 作。
系列Series
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values(值):一组数据
- index(索引):相关的数据索引标签(索引数据可以为连续整数,也可以自定义)
Series的结构示意图:
#1.使用列表进行创建
n_list=[1,2,3,4,5]
n_series=pd.Series(n_list)
#2.使用np.array进行创建
n_array=np.array([1,2,3,4,5])
n_series=pd.Series(n_array)
#3.使用字典进行创建,此种情况下“键”为index,“值”为values
d={'Name':'Rise','color':'red','age':18}
n_dict=pd.Series(d)
#4.自定义索引值
n_array=np.array([1,2,3,4,5])
n_series=pd.Series(n_array,index=list('abcde'))
调用Series
- 单个调用:像字典一样
s["a"]
,或者s.loc["a"]
- 批量调用(切片调用):
- 连续:
n1=n_series.loc[0:3]
- 离散:
n2=n_series.loc[[1,4]]
- 连续:
- 隐式索引
iloc
前几种为显式索引loc
,还可以使用隐式索引iloc
。
显式索引loc
索引的目标是本来的索引值,隐式索引iloc
的目标是0,1,2,3……
数据帧DataFrame
DataFrame是由Series构成的,一个类似于表格的数据结构,可以看做是由Series组成的字典(共用同一个索引)。
DataFrame由按一定顺序排列的多列数据组成。
它可以将Series的使用场景从一维拓展到多维。
DataFrame既有行索引,也有列索引(Series只有一个索引)。
DataFrame数据帧的两要素称之为index和columns
{ index ——行索引 columns ——列索引 \left\{ \begin{aligned} &\text{index}& &&\text{——行索引}\ &\text{columns}& &&\text{——列索引}\ \end{aligned} \right. {indexcolumns——行索引——列索引
创建DataFrame一般来说,DataFrame常从外部导入,我们并不会经常自己创建DataFrame
最常用的方式是用字典来创建。
#用字典来创建的时候,“值”中列表的长度要一致,不然会报错
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":['95','96','97','98','99'],
"学号":['1','2','3','4','5']
}
df=pd.DataFrame(dic)
#字典的“键”为列头,字典的index为行头
df = pd.DataFrame({"张三":150,"李四":100},index=["语文","数学","英语","理综"])
#这样做可以批量定义每一列
DataFrame索引列的规定与修改
如果不规定哪一列为索引列,默认再加一列从0开始的连续整数作为索引列。
在DataFrame之后,可以使用set_index
函数对索引列进行修改:
#用字典来创建的时候,“值”中列表的长度要一致,不然会报错
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":['95','96','97','98','99'],
"学号":['1','2','3','4','5']
}
df=pd.DataFrame(dic)
df.set_index("姓名",inplace=True)
DataFrame的调用
- 直接引用,如:
df['姓名']
- 借助
loc
函数和iloc
函数:
与Series类似,DataFrame的loc
和iloc
只是将Series的单个索引变成了两个索引,这样才能访问二维数据
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":[95,96,97,98,99],
"学号":['1','2','3','4','5']
}
df=pd.DataFrame(dic)
df.set_index("姓名",inplace=True)
score1=df.loc['zcy','分数']
score2=df.iloc[0,0]
##score1和score2结果一致
DataFrame的“增”
行和列都可以增加
- 增添新列(有值新列与空列):
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":[95,96,97,98,99],
"学号":['1','2','3','4','5']
}
df=pd.DataFrame(dic)
df.set_index("姓名",inplace=True)
df["性别"]='male' #增加有值的新列
df["帅气程度"]='' #增加空列
- 增添新行:
可使用loc
或者iloc
函数进行行的增添
df.loc['wc']=[100,'6','male','']
注意添加的维度一定要匹配,若维度不一样则会报错
DataFrame的“删”使用drop函数进行列和行的删除
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":[95,96,97,98,99],
"学号":['1','2','3','4','5']
}
#方式1:
df.drop(columns='学号',inplace=True)
#方式2:
df.drop('学号',axis=1,inplace=True)
drop
函数可以使用columns
进行列的定位。
也可以使用axis
进行定位
对于方式1来说:
{ 使用关键词“index= … … ” , 删除某一行 使用关键词“columes= … … ” , 删除某一行 \left\{ \begin{aligned} &\text{使用关键词“index=……”}\quad,\text{删除某一行}&\ &\text{使用关键词“columes=……”}\quad,\text{删除某一行}&\ \end{aligned} \right. {使用关键词“index=……”,删除某一行使用关键词“columes=……”,删除某一行
对于方式2来说:
{
行定位
,
a
x
i
s
=
0
列定位
,
a
x
i
s
=
1
\left\{ \begin{aligned} \text{行定位}\quad,axis=0\ \text{列定位}\quad,axis=1\ \end{aligned} \right.
{行定位,axis=0列定位,axis=1
drop
函数的inplace
参数若为False,则只能通过赋值来将改动过的DataFrame赋给另一个变量;
inplace
参数若为True,则无需赋值,直接在原DataFrame上进行修改。
- DataFrame的列插入
可使用insert
函数来实现:
dic = {
"姓名":['zcy','hyz','ly','ssy','pyj'],
"分数":[95,96,97,98,99],
"学号":['1','2','3','4','5']
}
df=pd.DataFrame(dic)
df["性别"]='male'
df.insert(0,'帅气程度',[0,0,0,0,0])
同时,对于列删除来说,还可以选择del
函数(直接在原数据上进行修改)
- Dataframe的尺寸
行数:df.shape[0]
列数:df.shape[1]
注意这里一定要是方括号’[ ]‘而不能是圆括号’( )’
pandas库应用 导入数据
- 导入csv文件:
使用read_csv()
函数:
read_csv()
中的参数
参数 | 作用 | 备注 |
---|---|---|
(url) | 引入文件路径(相对路径或者绝对路径) | r"……" |
header | 指定从第几行开始计数 | 指定行数用来作为列名,数据开始行数。 如果文件中没有列名,则默认为0,否则设置为None。 |
index_col | 索引列 | 指定索引列。 这里不用整数作为索引,而是使用真实的索引列名称 |
- 导入excel:
使用read_excel()
函数:
read_excel()
中的参数
参数 | 作用 | 备注 |
---|---|---|
(url) | 引入文件路径(相对路径或者绝对路径) | r"……" |
header | 指定从第几行开始计数 | 指定行数用来作为列名,数据开始行数。 如果文件中没有列名,则默认为0,否则设置为None。 |
index_col | 索引列 | 指定索引列。 这里不用整数作为索引,而是使用真实的索引列名称 |
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)