利用python进行数据清洗
2021-04-15 15:31:15 100 举报
AI智能生成
利用python进行数据清洗
作者其他创作
大纲/内容
数据导入
csv文件
pd.read_csv('文件的全路径')
在pycharm中,如果全路径下有中文文件件,报错
解决:file=open(r'全路径') df=pd.read_csv(file)
excel文件
pa.read_excel('文件的全路径')
数据检查
选择子集
df.loc['行':'行','列':'列']
查看数据
初步查看:df.head()
统计信息,是否有异常值: df.describe()
查看一列:df['列名']
查看一列的前几行数据:df['列名'][:n]
查看多列:df[['列1','列2']]
where过滤:df[df[''列名]>condition]
重命名列名
导入文件时更改
df=pd.read_csv('文件完整路径',name=['自定义列名']
导入文件后更改
列:df.rename(columns={'原列名':'新列名'},inplace=True/Flase)
行:df.rename(index={'原行名':'新行名'},inplace=True/Flase)
数据类型转化
导入数据时改变
data = pd.read_csv(r'文件完整路径', dtype={'列名': int})
导入后数据改变
Dataframename['列名'].astype(数据类型)
字符串转化成数值
df.loc['Data2'] = pd.to_numeric(df.loc['Data2'] ,errors='coerce')
# 只转换能转换的,不能转换的赋值为 NaN(Not a Number)
数据排序
df.sort_values(by=['列1','列2'], ascending=True)
df.reset_index(drop=True)
df.reset_index(drop=True)
数据缺失
索引
空值
df.isnull()
非空值
df.notnull()
计算数量
df.isnull().sum()
处理
填充数据fillna()
使用默认值
空字符串
df['列名'].fillna('')
特殊值0/1
df['列名'].fillna('0')
缺失字符串:用最常见的频数类别代替;df['列名'].value_counts()
通过特征统计值
(缺失数据较少)
mean()平均值
df['列名'].fillna(df['列名'].mean())
mode()众数
df['列名'].fillna(df['列名'].mode())
media()中位数
df['列名'].fillna(df['列名'].media())
舍弃或者二元化处理
(缺失数据较多)
非空值赋予一元值 df.loc[df.['列名'].notnull,'列名']=newvalue1
空值赋予一元值 df.loc[df.['列名'].isnull,'列名']=newvalue2
插值法(通过缺失值前后
两点的数据估计中间点)
pd.interpolate()
利用缺失值上下填充
无限制
df['列名'].fillna(method='ffill') 向上
df['列名'].fillna(method='bfill') 向下
有限制
df['列名'].fillna(method='bfill',limit=2) 向下填充两个
随机森林算法预测(缺失值较少,推荐优先使用)
删除数据dropna()
根据缺失比例删除行
有就删除 —— df.dropna()
全部是才删除 —— df.dropna(how='all')
至少N个才删除 —— df.dropna(thresh=n)
某个/几个列值缺失删除 —— df.dropna(subset=['列1','列2'])
根据缺失比例删除列
有就删除 —— df.dropna(axis=1)
全部是才删除 —— df.dropna(how='all',axis=1)
直接删除列
df.drop(['列名'],axis=1)
重复数据
索引
查找重复值,两列以上的数据,只有每列内
容都相同时判定重复,返回的是布尔值.
df.duplicated()
计算重复值数量
df.duplicated().value_counts()
处理
删除
df.drop_duplicates(subset=['列1','列2'],
keep='first',inplace=True)
某列中存在数据的唯一值
df['列名'].unique()
在已经确定该列不应该存在重复项的前提下
在已经确定该列不应该存在重复项的前提下
离群点和极端值(异常值)
查找
df.describe()简单的统计分析,常用最大最小值进行观察
plt.bar()箱线图
处理
df.replace({'列名':(异常值)},新值)
数据转换
日期数据处理
统计日期数据
df['date'].value_counts()
异常日期范围1976-77
#通过特殊字符串过滤数据
row_with_dashs=df['date'].str.contain('-')fillna(False)
for i ,dash in df[row_with_dashes].iterrows():
df.at[i,'Date']=dash['Date'][0:4]#1976-77取前4个数1976
df['Date'].value_counts()
异常日期c.1977
#通过特殊字符串过滤数据
row_with_cs=df['date'].str.contain('c')fillna(False)
for i ,row in df[row_with_cs].iterrows():
df.at[i,'Date']=row['Date'][:-4]#c.1977取后面的四个数
df['Date'].value_counts()
无效日期值
如空值或错误值
df['Date']=df['Date'].replace('Unknown','0',regex=True)
列数据单位不统一
# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('单位符号').fillna(False)
# 将 lbs 的数据转换为 kgs 数据
for i,lbs_row in df[rows_with_lbs].iterrows():
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
分类数据:用数值代替one-hot编码
两种分类数据:map函数(都适用)
map函数进行分类映射也为one-hot
编码提供必需步骤
sex_dict={'male':0,'female':1}
df['sex']=df['sex'].map(sex)
#用map函数表中sex列的每一个数据,
规则按照sex_dict进行数据转化
三种以上分类变量:one-hot编码
get-dummies
存放提取特征:df_list=pd.DataFrame()
one-hot编码:pd.get_dummies()
添加one-hot编码到原数据集:full=pd.concat([df_list,full],axis=1)
删除原数据集中的数据:full.drop()
#具体代码看备注和链接
数据字段拆分与合并
分列
df[['新列1','新列2']]=df['原列名'].split('这里是填写符号',expand=True)
df.drop('原列',axis=1,inplace=True)
#expand=True在当前df上增加新列,inplace表示就地删除
合并
提取字符成新列
自定义函数,并且用map函数进行列中每一个数据计
算,最后返回给新的列。具体程序看备注和链接
离散化和面元划分
连续数据转离散化,也叫分箱
bins=[0,15,30,50,80]
#例:0-15,15-30,30-50,50-80区间划分
geoup_names=['a','b','c','d']
#例:区间重命名
datagroup=pd.cut(Dataframename['列名'],bins,lables=froup_names)
数据规整化
大小写转换
全部转换成大写
df['列名'].map(str.upper)
全部转化成小写
df['列名'].map(str.lower)
首字母大写
df['列名'].map(str.title)
空格
去除左边空值
df['列名'].map(str.lstrip)
去除右边空值
df['列名'].map(str.rstrip)
去除两侧空格
df['列名'].map(str.strip)
保存结果
df.to_csv('新文件路径',encoding='utf-8')
收藏
0 条评论
下一页
为你推荐
查看更多