一、重复值处理
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
暂无评论内容