我们从网上爬取好的数据,看起来会很乱,我们需要对数据进行再次加工,筛选出我们需要的数据,此时就需要对数据进行清洗。
一点数据清洗对于后续的数据分析来说至关重要。Python中进行数据清洗的工具是Pandas。接下来我就来介绍一下如何使用Python简单地对凌乱的数据进行清洗。
首先我们需要以下从几个方面判断我们需要清洗的数据:
1、数据的完整性:检查数据是否有空值或缺失
2、数据的全面性:检查同类数据的单位是否是一致的,比如体重有Kg和g,身高有M和CM
3、数据的合法性:检查数据是否合法,如存在非ASCII码字符或者非法字符
4、数据的唯一性:检查数据是否有重复
考虑好这些问题后我们把需要清洗的内容列出一张清单,并按照清单进行清洗。
以下是实际清洗流程:
第一步,下载pandas包,可以使用pycharm->setting->python interpreter直接下载,也可以在终端输入pip3 install pandas下载
第二步,导包
- import pandas as pd
- from pandas import Series,DataFrame
第三步,开始清洗,示例代码如下:
- import pandas as pd
- from pandas import Series,DataFrame
-
- def clean():
- df = DataFrame(pd.read_excel('./cleantest.xlsx'))
- #对列进行重命名
- df.rename(columns={0:'姓名', 1:'性别', 2:'年龄',3:'体重',4:'身高'},inplace=True)
- #对整行为空值的数据进行删除
- df.dropna(how='all',inplace=True)
- #使用平均值来填充体重缺失的值
- df[u'体重'].fillna(int(df[u'体重'].mean()),inplace=True)
- #对身高列的度量做统一,我们使用df.apply方法来统一身高的度量,使用df.columns.str.upper方法将首字母统一为大写
- def format_height(df):
- if(df['身高']<3):
- return df['身高'] * 100
- else:
- return df['身高']
- df['身高'] = df.apply(format_height,axis=1)
- #2 姓名首字母大小写不统一,统一成首字母大写
- df.columns = df.columns.str.upper()
- #对姓名列的非法字符做过滤,我们可以使用df.replace方法,删除字母前面的空格,我们可以使用df.map方法
- #1、英文字母出现中文->删除非ASCLL码的字符
- df['姓名'].replace({r'[^\x00-\x7f]+':''},regex=True,inplace=True)
- #2、英文名字出现了问号->删除问号
- df['姓名'].replace({r'\?+':''},regex=True,inplace=True)
- #3、名字前出现空格->删除空格
- df['姓名'] = df['姓名'].map(str.lstrip)
- #将年龄列为负值的年龄处理为正数,我们可以使用df.apply方法:
- def format_sex(df):
- return abs(df['年龄'])
- df['年龄'] = df.apply(format_sex,axis=1)
- #删除行记录重复的数据,我们可以使用df.drop_duplicates方法:
- df.drop_duplicates(['姓名'],inplace=True)
- #我们讲清洗好的数据保存至新的excel中,我们可以使用df.to_excel方法:
- df.to_excel('./data02.xlsx',index=False)
- if __name__ == '__main__':
- clean()
pandas的一些常用方法:
1)从excel中加载数据到DataFrame,pandas.read_excel('文档位置')
2)对列进行重命名,rename
- def rename(
- self,
- mapper: Renamer | None = None,
- *,
- index: Renamer | None = None,
- columns: Renamer | None = None,
- axis: Axis | None = None,
- copy: bool = True,
- inplace: bool = False,
- level: Level | None = None,
- errors: str = "ignore",
- ) -> DataFrame | None:
3)删除空值,dropna
- def dropna(
- self,
- axis: Axis = 0,
- how: str = "any",
- thresh=None,
- subset: IndexLabel = None,
- inplace: bool = False,
- ):
4)填充值,fillna
- def fillna(
- self,
- value: object | ArrayLike | None = None,
- method: FillnaOptions | None = None,
- axis=None,
- inplace=False,
- limit=None,
- downcast=None,
- ) -> Series | None:
- return super().fillna(
- value=value,
- method=method,
- axis=axis,
- inplace=inplace,
- limit=limit,
- downcast=downcast,
- )
5)将首字母统一为大写,columns.str.upper
6) 过滤非法字符replace
- def replace(
- self,
- to_replace=None,
- value=lib.no_default,
- inplace=False,
- limit=None,
- regex=False,
- method: str | lib.NoDefault = lib.no_default,
- ):
- return super().replace(
- to_replace=to_replace,
- value=value,
- inplace=inplace,
- limit=limit,
- regex=regex,
- method=method,
- )
7) 删除空格,map
- def map(self, arg, na_action=None) -> Series:
- new_values = self._map_values(arg, na_action=na_action)
- return self._constructor(new_values, index=self.index).__finalize__(
- self, method="map"
- )
8)将正负值转换,apply
- def apply(
- self,
- func: AggFuncType,
- axis: Axis = 0,
- raw: bool = False,
- result_type=None,
- args=(),
- **kwargs,
- ):
- from pandas.core.apply import frame_apply
-
- op = frame_apply(
- self,
- func=func,
- axis=axis,
- raw=raw,
- result_type=result_type,
- args=args,
- kwargs=kwargs,
- )
- return op.apply().__finalize__(self, method="apply")
9)删除行记录重复的数据,drop_duplicates
- def drop_duplicates(
- self,
- subset: Hashable | Sequence[Hashable] | None = None,
- keep: Literal["first"] | Literal["last"] | Literal[False] = "first",
- inplace: bool = False,
- ignore_index: bool = False,
- ) -> DataFrame | None:
-
- if self.empty:
- return self.copy()
-
- inplace = validate_bool_kwarg(inplace, "inplace")
- ignore_index = validate_bool_kwarg(ignore_index, "ignore_index")
- duplicated = self.duplicated(subset, keep=keep)
-
- result = self[-duplicated]
- if ignore_index:
- result.index = default_index(len(result))
-
- if inplace:
- self._update_inplace(result)
- return None
- else:
- return result
10)清洗好的数据保存至新的excel中,to_excel
第四步,去新的excel中查看数据是否清洗完成。
简单地数据清洗就介绍到这里了,经过清洗后的数据更加方便我们进行数据分析。