Advertisement

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

全部评论 (0)

还没有任何评论哟~