
在数据分析工作中,我们经常会遇到数据不一致的情况,尤其是在文本型数据中。例如,在对用户或产品名称进行分组统计时,由于输入习惯、录入错误或系统差异,同一个实体可能会有多种不同的表示形式(如“michael”、“michael ()”或“sarah - (0)”、“sarah”)。这种不一致性会导致groupby操作无法正确识别并聚合相同的数据,从而影响分析结果的准确性。
要解决上述问题,核心在于对不一致的字符串数据进行标准化处理,使其具有统一的格式。Python的re模块(正则表达式)是处理这类问题的强大工具。
1. 理解正则表达式 [^A-Za-z ]+
在我们的场景中,目标是将“Name”列中的各种干扰字符(如括号、连字符、数字)和多余空格去除,只保留英文字母。我们可以使用以下正则表达式:
结合re.sub()函数,我们可以用空字符串替换掉所有匹配到的非字母和非空格字符,从而达到清洗的目的。
2. 移除首尾空格:strip()方法
经过正则表达式处理后,字符串中可能仍然存在多余的首尾空格。str.strip()方法可以有效地移除字符串开头和结尾的所有空白字符(包括空格、制表符、换行符等)。
3. 统一大小写:lower()或upper()方法
为了确保“Michael”和“michael”被识别为同一个实体,通常还需要将所有字符串转换为统一的大小写形式(如全部小写或全部大写)。str.lower()方法可以将字符串转换为小写。
在Pandas DataFrame中,我们可以直接对Series(列)应用字符串方法,这比迭代行或使用apply()配合自定义函数更高效。
假设我们有以下原始DataFrame:
| Name | Fee |
|---|---|
| Michael | 3 |
| Michael () | 4 |
| Sarah - (0) | 5 |
| Sarah | 5 |
我们的目标是将其转换为:
| Name | Fee |
|---|---|
| Michael | 7 |
| Sarah | 10 |
以下是实现这一过程的Python代码:
import pandas as pd
import re
# 原始DataFrame数据
data = {
'Name': ['Michael', 'Michael ()', 'Sarah - (0)', 'Sarah'],
'Fee': [3, 4, 5, 5]
}
df = pd.DataFrame(data)
print("--- 原始DataFrame ---")
print(df)
print("-" * 30)
# 步骤1:使用正则表达式清理 'Name' 列
# str.replace() 结合 regex=True 可以直接使用正则表达式进行替换
# r'[^A-Za-z ]+' 匹配所有非字母和非空格的字符
df['Cleaned_Name'] = df['Name'].str.replace(r'[^A-Za-z ]+', '', regex=True)
print("--- 步骤1: 移除特殊字符后的DataFrame ---")
print(df[['Name', 'Cleaned_Name', 'Fee']])
print("-" * 30)
# 步骤2:移除首尾空格并统一大小写
# str.strip() 移除字符串首尾的空白字符
df['Cleaned_Name'] = df['Cleaned_Name'].str.strip()
# str.lower() 将所有字符转换为小写,确保大小写一致性
df['Cleaned_Name'] = df['Cleaned_Name'].str.lower()
print("--- 步骤2: 移除空格并统一大小写后的DataFrame ---")
print(df[['Name', 'Cleaned_Name', 'Fee']])
print("-" * 30)
# 步骤3:可选:将清理后的名称首字母大写,以符合最终输出格式要求
# str.capitalize() 将字符串的第一个字符转换为大写,其余转换为小写
df['Cleaned_Name'] = df['Cleaned_Name'].str.capitalize()
print("--- 步骤3: 最终清理后的DataFrame (Name列已标准化) ---")
print(df[['Name', 'Cleaned_Name', 'Fee']])
print("-" * 30)
# 步骤4:使用清理后的列进行 groupby 和求和
# 以 'Cleaned_Name' 列进行分组,并对 'Fee' 列求和
df_grouped = df.groupby(['Cleaned_Name'])['Fee'].sum().reset_index()
# 步骤5:重命名列,使输出符合期望
df_grouped = df_grouped.rename(columns={'Cleaned_Name': 'Name'})
print("--- 最终分组聚合结果 ---")
print(df_grouped)代码解释:
通过本教程,我们学习了如何利用Python的正则表达式和Pandas的字符串处理功能,对DataFrame中的不一致字符串数据进行标准化清洗。这种数据预处理是进行准确数据分析和聚合的关键步骤。掌握这些技巧,可以有效提升数据处理的效率和结果的可靠性。在实际应用中,务必根据数据的具体特征和分析需求,灵活调整清洗策略。
以上就是Pandas数据清洗与分组:使用正则表达式标准化列数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号