数据清洗,是进行数据分析处理和使用数据训练模型的必经之路,也是数据科学家/程序员最费力的地方。
对于数据清洗处理,这些代码有两个优势:一是由函数编写,不需改变参数即可直接使用。第二个非常简单,最长的注释也只有11行。
每个人都可将本文收集起来作为工具包使用。
这次数据清理代码,总共覆盖了8个场景,分别是:删除多列,改变数据类型,将分类变量转换成数字变量,检查丢失的数据,移除一列中的字符串,删除列中的空格,将两列以字符串连接起来(有条件),将时间戳转换为日期时间格式。
并不是所有的列都能进行数据分析,使用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
在数据量较大的数据集下,需要对数据类型进行转换以节省内存。
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')
有些机器学习模型需要使用数字格式的变量。首先要把分类变量转换成数字变量。与此同时,您还可以保存您的分类变量以实现数据的可视化。
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)
若要检查每一列丢失的数据量,使用以下代码是最快的方法。使您能够更好地理解哪一列丢失了更多数据,从而决定如何执行下一步数据清理和分析操作。
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)
有时,在字符串中会出现新的字符或其他古怪的符号,这可以使用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)
当数据杂乱无章时,可能发生任何事情。在字符串的开头通常会有空格。当移除一列字符串开始处的空白时,以下代码很有用。
def remove_col_white_space(df):
# remove white space at the beginning of string
df[col] = df[col].str.lstrip()
如果您希望在条件下使用字符串将两个列连接在一起,此代码非常有用。例如,您可以将一些字母设置在第一栏的末尾,然后将其和第二栏连起来。
当连接完成时,末尾的字母也会被删除。
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
当处理时序数据时,我们可能会遇到字符串格式化时间戳列。
这就是说,要把字符串格式转换成日期时间格式(或其它基于我们需要指定的格式),这样才能有效地分析数据。
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'))