
在数据分析实践中,我们经常会遇到数据格式不规范的情况,例如在同一个字符串列中混合了数字和文本。当我们需要对这些数字进行计算(如求和、平均值)时,就必须先将它们精确地提取出来。pandas库提供了强大的字符串处理功能,特别是series.str.extract方法,能够结合正则表达式高效地解决这类问题。
假设我们有一个Pandas DataFrame,其中包含产品类别(Category)、销售量(Sales)和支付状态(Paid)等信息。Sales列的数据格式不一致,例如"1 table"、"3chairs"、"8 cushions"等,数字与文本紧密相连,且文本部分也不固定。我们的目标是从Sales列中提取出纯粹的销售数字,并根据Category列进行分组求和。
首先,我们来创建示例数据:
import pandas as pd
import io
data = """Category Sales Paid
Table 1 table Yes
Chair 3chairs Yes
Cushion 8 cushions Yes
Table 3Tables Yes
Chair 12 Chairs No
Mats 12Mats Yes
"""
df = pd.read_csv(io.StringIO(data), sep=r'\s{2,}', engine='python')
print("原始DataFrame:")
print(df)输出:
原始DataFrame: Category Sales Paid 0 Table 1 table Yes 1 Chair 3chairs Yes 2 Cushion 8 cushions Yes 3 Table 3Tables Yes 4 Chair 12 Chairs No 5 Mats 12Mats Yes
解决此问题的核心是使用str.extract方法,它允许我们通过正则表达式从字符串中捕获特定模式的数据。
我们需要一个正则表达式来匹配字符串开头的数字。
因此,正则表达式为^(\d+)。
将正则表达式应用于Sales列,并指定expand=False以返回一个Series而不是DataFrame(因为我们只有一个捕获组)。提取出的结果将是字符串类型,需要通过astype(int)将其转换为整数类型,以便进行数学运算。
# 提取Sales列中的数字并转换为整数
extracted_sales = df['Sales'].str.extract('^(\d+)', expand=False).astype(int)
print("\n提取并转换后的销售数字:")
print(extracted_sales)输出:
提取并转换后的销售数字: 0 1 1 3 2 8 3 3 4 12 5 12 Name: Sales, dtype: int64
现在我们已经得到了纯粹的销售数字,可以将其与原始DataFrame的Category列结合,进行分组求和。
# 计算所有项目的销售总量
total_sales_per_category = extracted_sales.groupby(df['Category']).sum()
print("\n按类别统计的总销售量:")
print(total_sales_per_category)输出:
按类别统计的总销售量: Category Chair 15 Cushion 8 Mats 12 Table 4 Name: Sales, dtype: int64
有时,我们可能需要基于另一个列的条件来计算销售量,例如只计算已支付(Paid == 'Yes')的销售量。这时,我们可以先对Sales列进行条件筛选,然后再进行提取和聚合。
一种有效的做法是使用Series.where()方法。where()方法根据条件选择性地替换Series中的值。如果条件为True,则保留原始值;如果条件为False,则替换为other参数指定的值。在这里,我们希望对于Paid不为'Yes'的行,其销售量计为0。
# 只计算已支付(Paid == 'Yes')项目的销售总量
conditional_sales = (
df['Sales']
.where(df['Paid'] == 'Yes', other='0') # 如果Paid不是'Yes',则将Sales值替换为'0'
.str.extract('^(\d+)', expand=False)
.astype(int)
.groupby(df['Category'])
.sum()
)
print("\n按类别统计的已支付销售量:")
print(conditional_sales)输出:
按类别统计的已支付销售量: Category Chair 3 Cushion 8 Mats 12 Table 4 Name: Sales', dtype: int64
在这个例子中,Chair类别的总销售量是15,但只有一条记录是Paid == 'Yes'(3chairs),另一条(12 Chairs)是Paid == 'No'。因此,条件性聚合后,Chair的已支付销售量变为3。
通过本教程,我们学习了如何利用Pandas的str.extract方法结合正则表达式,有效地从混合字符串列中提取数值,并进行灵活的分组聚合。掌握这些技巧,将大大提升您在数据清洗和预处理方面的效率和能力。
以上就是Pandas数据清洗:从混合字符串列中提取数值并进行分组聚合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号