数据清洗与准备


数据清洗,是进行数据分析处理和使用数据训练模型的必经之路,也是数据科学家/程序员最费力的地方。

对于数据清洗处理,这些代码有两个优势:一是由函数编写,不需改变参数即可直接使用。第二个非常简单,最长的注释也只有11行。

每个人都可将本文收集起来作为工具包使用。

涉及8个主要场景的数据清洗代码

这次数据清理代码,总共覆盖了8个场景,分别是:删除多列,改变数据类型,将分类变量转换成数字变量,检查丢失的数据,移除一列中的字符串,删除列中的空格,将两列以字符串连接起来(有条件),将时间戳转换为日期时间格式。

1 删除多列

并不是所有的列都能进行数据分析,使用df.drop很容易删除指定的列。

def drop_multiple_col(col_names_list, df):
 '''
 AIM -> Drop multiple columns based on their column names
 INPUT -> List of column names, df
 OUTPUT -> updated df with dropped columns
 ------
 '''
 df.drop(col_names_list, axis=1, inplace=True)
 return df

2 转换数据类型

在数据量较大的数据集下,需要对数据类型进行转换以节省内存。

def change_dtypes(col_int, col_float, df):
 '''
 AIM -> Changing dtypes to save memory
 INPUT -> List of column names (int, float), df
 OUTPUT -> updated df with smaller memory
 ------
 '''
 df[col_int] = df[col_int].astype('int32')
 df[col_float] = df[col_float].astype('float32')

3 将分类变量转换为数值变量

有些机器学习模型需要使用数字格式的变量。首先要把分类变量转换成数字变量。与此同时,您还可以保存您的分类变量以实现数据的可视化。

def convert_cat2num(df):
 # Convert categorical variable to numerical variable
 num_encode = {'col_1' : {'YES':1, 'NO':0},
 'col_2' : {'WON':1, 'LOSE':0, 'DRAW':0}}
 df.replace(num_encode, inplace=True)

4 检测丢失的数据

若要检查每一列丢失的数据量,使用以下代码是最快的方法。使您能够更好地理解哪一列丢失了更多数据,从而决定如何执行下一步数据清理和分析操作。

def check_missing_data(df):
 # check for any missing data in the df (display in descending order)
 return df.isnull().sum().sort_values(ascending=False)

5 删除列字符串

有时,在字符串中会出现新的字符或其他古怪的符号,这可以使用df[‘col_1’].replace将其排除。

def remove_col_str(df):
 # remove a portion of string in a dataframe column - col_1
 df['col_1'].replace('
', '', regex=True, inplace=True)
 # remove all the characters after  (including ) for column - col_1
 df['col_1'].replace(' .*', '', regex=True, inplace=True)

6 删除列空格

当数据杂乱无章时,可能发生任何事情。在字符串的开头通常会有空格。当移除一列字符串开始处的空白时,以下代码很有用。

def remove_col_white_space(df):
 # remove white space at the beginning of string
 df[col] = df[col].str.lstrip()

7 用字符串连接两列(带条件)

如果您希望在条件下使用字符串将两个列连接在一起,此代码非常有用。例如,您可以将一些字母设置在第一栏的末尾,然后将其和第二栏连起来。
当连接完成时,末尾的字母也会被删除。

def concat_col_str_condition(df):

# concat 2 columns with strings if the last 3 letters of the first column are 'pil'

mask = df['col_1'].str.endswith('pil', na=False)

col_new = df[mask]['col_1'] + df[mask]['col_2']

col_new.replace('pil', ' ', regex=True, inplace=True) # replace the 'pil' with emtpy space

8 转换时间戳(从字符串到日期时间格式)

当处理时序数据时,我们可能会遇到字符串格式化时间戳列。
这就是说,要把字符串格式转换成日期时间格式(或其它基于我们需要指定的格式),这样才能有效地分析数据。

def convert_str_datetime(df):
 '''
 AIM -> Convert datetime(String) to datetime(format we want)
 INPUT -> df
 OUTPUT -> updated df with new datetime format
 ------
 '''
 df.insert(loc=2, column='timestamp', value=pd.to_datetime(df.transdate, format='%Y-%m-%d %H:%M:%S.%f'))