2、Python数据分析:数据的清洗预处理

一、重复值处理

1、检测重复值

import pandas as pd

'''

使用duplicated()方法可以检测DataFrame中的重复行。该方法返回一个布尔Series,表示每一行是否为重复行。

'''

# 创建一个包含重复行的DataFrame

data = {

         'S_ID':   [“s001″,”s001″,”s002″,”s003”],

         'S_NAME': [“lily001”, “lily001″,”lily002″,”lily003”]

        }

df = pd.DataFrame(data)

df

# 检测重复行

duplicates = df.duplicated()

duplicates

2、标记重复值

标记重复值:使用duplicated()方法结合布尔索引,可以标记DataFrame中的重复行。可以将重复行的值设置为特定的标记值。

# 创建一个包含重复行的DataFrame

data = {

         'S_ID':   [“s001″,”s001″,”s002″,”s003”],

         'S_NAME': [“lily001”, “lily001″,”lily002″,”lily003”]

        }

df = pd.DataFrame(data)

df

# 标记重复行

df['Is_Duplicate'] = df.duplicated()

df

3、删除所有列完全相同的重复行

假设你有一个Excel文件goods001.xlsx,其中包含一些完全相同的行。你可以使用drop_duplicates()方法来删除这些重复行。goods001.xlsx文件内容如下:

import pandas as pd

# 读取Excel文件

df = pd.read_excel('data/2_Data_Cleaning/goods001.xlsx')

# 删除所有列完全相同的重复行

df_unique = df.drop_duplicates()

# 保存结果到新的Excel文件

df_unique.to_excel('data/2_Data_Cleaning/out/goods001_out.xlsx', index=False)

假设你有一个Excel文件,其中包含多列,但你只想基于某2列(goods_name,goods_price)来删除重复行。

import pandas as pd

# 读取Excel文件

df = pd.read_excel('data/2_Data_Cleaning/goods002.xlsx')

# subset=['goods_name', 'goods_price']参数指定了根据哪几列来检查重复。

# keep='first'参数表示保留每个重复组中的第一行。如果你想要保留最后一行,可以将'first'改为 'last'。

df_no_duplicates = df.drop_duplicates(subset=['goods_name', 'goods_price'], keep='first')

# 保存结果到新的Excel文件

df_no_duplicates.to_excel('e:/data/2_Data_Cleaning/out/goods002_out.xlsx', index=False)

二、缺失值处理

1. 检查缺失值

首先,你需要知道哪些地方存在缺失值。Pandas提供了几种方法来帮助你检查缺失值:

isnull() 或 isna():返回一个布尔值的DataFrame,表示每个元素是否为缺失值。
notnull() 或 notna():返回一个布尔值的DataFrame,表示每个元素是否不是缺失值。
any() 和 all():用于检查DataFrame中的某些条件是否满足。例如,df.isnull().any() 可以检查是否有任何缺失值。

import pandas as pd

# 创建一个包含缺失值的DataFrame

data = {'A': [1, 2, None, 3],

        'B': [5, None, None, 6],

        'C': [9, 10, 11, 12]}

df = pd.DataFrame(data)

df

# 检查哪些位置有缺失值

print(df.isnull())

# 检查每列是否有缺失值

print(df.isnull().any())

# 检查整个DataFrame是否有缺失值

print(df.isnull().values.any())

2. 删除缺失值

如果缺失值对你的分析影响不大,或者你有足够的数据可以忽略这些缺失值,可以考虑删除它们:

dropna():删除包含缺失值的行或列。

axis=0(默认):删除包含缺失值的行。
axis=1:删除包含缺失值的列。
how='any'(默认):只要有任何一个缺失值就删除该行/列。
how='all':只有当所有值都是缺失值时才删除该行/列。
thresh=n:要求每行/列至少有n个非缺失值。
subset=[columns]:仅在指定的列中检查缺失值。

#示例-1:删除包含任何缺失值的行

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods003.xlsx'  

df = pd.read_excel(file_path)

df

# 删除包含任何缺失值的行

df_cleaned = df.dropna()

# 保存处理后的数据到新的Excel文件

output_file_path = 'data/2_Data_Cleaning/out/goods003_out_1.xlsx'  

df_cleaned.to_excel(output_file_path, index=False)

print(f”处理完成,已保存到 {output_file_path}”)

#示例-2:删除包含所有缺失值的行

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods003.xlsx'

df = pd.read_excel(file_path)

df

# 删除包含所有缺失值的行

df_cleaned_all = df.dropna(how='all')

# 保存处理后的数据到新的Excel文件

output_file_path = 'data/2_Data_Cleaning/out/goods003_out_2.xlsx'  

df_cleaned_all.to_excel(output_file_path, index=False)

print(f”处理完成,已保存到 {output_file_path}”)

#示例-3:删除包含任何缺失值的列

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods004.xlsx'

df = pd.read_excel(file_path)

# 删除包含任何缺失值的列

df_cleaned = df.dropna(axis=1)

# 保存处理后的数据到新的Excel文件

output_file_path = 'data/2_Data_Cleaning/out/goods004_out_1.xlsx'

df_cleaned.to_excel(output_file_path, index=False)

print(f”处理完成,已保存到 {output_file_path}”)

#示例-4:要求每行至少有3个非缺失值

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods005.xlsx'  

df = pd.read_excel(file_path)

df

# 要求每行至少有3个非缺失值

df_cleaned_thresh = df.dropna(thresh=3)

df_cleaned_thresh

# 保存处理后的数据到新的Excel文件

output_file_path = 'data/2_Data_Cleaning/out/goods005_out_1.xlsx'

df_cleaned.to_excel(output_file_path, index=False)

print(f”处理完成,已保存到 {output_file_path}”)

3. 填充缺失值

如果删除缺失值会导致数据量减少太多,可以考虑填充缺失值。Pandas提供了多种填充方法:

fillna():用指定的值或方法填充缺失值。

value:用指定的值填充缺失值。
method='ffill':用前一个非缺失值填充(前向填充)。
method='bfill':用后一个非缺失值填充(后向填充)。
limit=n:限制填充的次数。

#示例-1:用0填充所有缺失值

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods003.xlsx'  

df = pd.read_excel(file_path)

df

# 用0填充所有缺失值

df_filled = df.fillna(0)

# 用前一个非缺失值填充

#df_ffilled = df.fillna(method='ffill')

# 用后一个非缺失值填充

#df_bfilled = df.fillna(method='bfill')

# 用前一个非缺失值填充,但最多填充两次

#df_ffilled_limit = df.fillna(method='ffill', limit=2)

df_filled

# 保存处理后的数据到新的Excel文件

output_file_path = 'data/2_Data_Cleaning/out/goods003_out_3.xlsx'  

df_filled.to_excel(output_file_path, index=False)

print(f”处理完成,已保存到 {output_file_path}”)

三、异常值处理

根据业务逻辑或领域知识,可以直接设置某些条件来过滤异常值。

import pandas as pd

# 读取Excel文件

file_path = 'data/2_Data_Cleaning/goods006.xlsx'

df = pd.read_excel(file_path)

df

# 设置条件

df_cleaned = df[(df['goods_price'] >= 10) & (df['goods_price'] <= 100)]

df_cleaned

四、使用正则表达式进行清洗预处理

'''

1、假设有如下网页内容

Content = { 我靠!今年我公司电子产品销售额只有10万元,特别是iPhone销售额只有3万元,都不够房租水电费用的!}

请使用正则表达式过滤掉不文明词语”我靠”

'''

str = “我靠!今年我公司电子产品销售额只有10万元,特别是iPhone销售额只有3万元,都不够房租水电费用的!”

str = str.replace('我靠!', '') # 将字符串中'我靠!'替换为空格

print(str)

输出:

今年我公司电子产品销售额只有10万元,特别是iPhone销售额只有3万元,都不够房租水电费用的!

'''

2、假设网页有如下一些内容:

Content1 = { ####今年的销售额为100万,******净利润为20万,#####同比增长10% }

请使用正则表达式过滤掉和数字、中文无关的”#”、和”*”字符

'''

import re # 导入正则表达式库

s = “####今年的销售额为100万,******净利润为20万,#####同比增长10%”

s = re.sub(“[*#]”, “”, s) # 调用sub函数将字符串中所有*#替换为空格

print(s)

输出:

今年的销售额为100万,净利润为20万,同比增长10%

'''

3、使用findall()函数实现下面的功能

网页有段内容={python2.7、python3.x都是python的版本,只不过python2.7不再维护了}

请使用findall()函数搜索所有的”python”字符串

'''

import re # 导入正则表达式库

s = “python2.7,python3.x都是python的版本,只不过python2.7不再维护了”

s = re.findall(“python”, s) # 使用findall()函数搜索所有的”python”字符串

print(s)

输出:

['python', 'python', 'python', 'python']

'''

4、使用sub()函数提取网页内容的电话号码,内容如下:

{ 0451-66666666,0451-99999999 #这是一热销的电话号码,号码本身价值10万元以上” }

请将”0451-66666666,0451-99999999″提取出来

'''

import re # 导入正则表达式库

phone = “0451-66666666,0451-99999999 #这是一热销的电话号码,号码本身价值10万元以上”

num = re.sub(r'#.*$', “”, phone) # 通过正则表达式清洗数据

print(“电话号码是: “, num)

输出:

电话号码是:  0451-66666666,0451-99999999

五、删除多余的特征

'''

假设有一个房屋信息的DataFrame,包含了不同房屋的地区、面积、卧室数量、是否有花园和房价等信息。现在我们想要删除”地区”、

“是否有花园”和”房价”这三列。

'''

import pandas as pd

data = {'地区': ['A区', 'B区', 'C区', 'D区'],

        '面积': [100, 200, 150, 300],

        '卧室数量': [2, 3, 2, 4],

        '是否有花园': ['是', '否', '是', '是'],

        '房价': [1000, 2000, 1500, 3000]}

df = pd.DataFrame(data)

df

#使用drop方法删除指定的列,并将结果赋值给新的DataFrame `df1`:

df1 = df.drop(columns=['地区', '是否有花园', '房价'])

df1

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容