
7个让你的数据准备时间减半的Pandas技巧
图片由 Editor | ChatGPT 提供
数据准备是任何数据科学或分析项目中耗时最多的部分之一,但并非必须如此。通过适当的技术,Pandas 可以帮助您快速地将杂乱复杂的数据集转换为干净、可分析的格式。从处理缺失数据到重塑和优化您的 DataFrame,一些技巧可以为您节省数小时的工作。
在本文中,您将发现七个实用的 Pandas 技巧,它们可以加快您的数据准备过程,并帮助您更多地关注分析而非清理工作。
1. 使用 assign() 链式转换
创建新列或修改现有列是数据转换的核心部分。`.assign()` 方法允许您链接转换,而无需创建中间变量或将过程分解为多个步骤。
1 2 |
df = (df.assign(total_sales=lambda x: x['units_sold'] * x['unit_price']) .assign(log_sales=lambda x: np.log1p(x['total_sales']))) |
在这里,我们通过将 units_sold 乘以 `unit_price` 来创建一个名为 `total_sales` 的新列,然后创建另一个名为 `log_sales` 的列,其值为 total sales 的对数。
2. 使用 fillna() 中的字典填充缺失值
处理缺失值是数据准备任务中最常见和最早的任务之一。您可以利用 `fillna()` 填充多个列,而不是为每个列编写单独的填充语句。
1 |
df.fillna({'price': 0, 'category': 'Unknown'}, inplace=True) |
这种方法让您完全控制每个列的填充方式。例如,您可以将缺失的价格替换为 0,并将缺失的类别标签替换为“Unknown”之类的字符串。
3. 使用 explode() 展平列表列
许多数据集(例如 JSON、嵌套 CSV)包含类似列表的数据列。`explode()` 函数是一种将这些数据展平成单独的行,同时保持其他列不变的工具。
1 |
df.explode('tags') |
此函数将列表中的每个项目转换为其自己的行,同时保持其余数据不变。这对于处理一对多关系非常有用,其中每一行都可以与多个标签相关联。
4. 使用 query() 进行可读性过滤
使用逻辑条件过滤数据可能会变得混乱,尤其是在链接多个条件时。`query()` 使用类似 SQL 的表达式提供了一种更易读的过滤行的方式。
1 |
df.query('region == "West" and sales > 5000') |
这样可以轻松应用过滤器,而无需嵌套过深的括号。您可以编写复杂的条件,这些条件仍然一目了然。
5. 使用 groupby().agg() 进行命名聚合
汇总数据是分析过程的关键部分。您可以使用 `.agg()` 方法中的命名聚合为每个指标分配自定义名称,而不是使用默认的聚合名称。
1 2 3 4 |
df.groupby('category').agg( avg_sales=('sales', 'mean'), max_discount=('discount', 'max') ) |
这样,您的结果 DataFrame 将具有有意义的列名,如 `avg_sales` 和 `max_discount`,而不是仅仅是 `sales` 或 `discount`。
6. 使用 pd.to_datetime() 进行日期解析
处理混乱的日期格式?使用 `pd.to_datetime()` 将字符串转换为正确的日期对象。这使得以后处理基于日期的操作变得容易。
1 |
df['date'] = pd.to_datetime(df['date'], errors='coerce') |
设置 `errors='coerce'` 会告诉 Pandas 将无效的日期字符串转换为 `NaT` (Not a Time),这可以避免解析过程中的错误。
7. 使用 pipe() 实现模块化工作流
随着数据转换变得越来越复杂,您的代码可能会变得难以理解。`pipe()` 通过链接自定义函数,帮助您构建模块化、可重用的管道。
1 2 3 4 5 6 7 8 9 10 11 12 |
def clean_prices(df): return df.assign(price=lambda x: x['price'].fillna(0)) def add_sales_tax(df, rate=0.1): return df.assign(final_price=lambda x: x['price'] * (1 + rate)) # 示例用法 df = ( df .pipe(clean_prices) .pipe(add_sales_tax, rate=0.08) ) |
通过使用此函数,您可以将 DataFrame 传递给一系列自定义函数。每个函数将其 DataFrame 作为第一个参数,并返回一个修改后的版本。
总结
只需几个 Pandas 技巧,您就可以大大提高数据准备的速度和清晰度。以下是快速回顾:
这些技术可以帮助您减少样板代码,编写更清晰的代码,并更快地准备好数据以进行分析。通过掌握它们,您将花费更少的时间进行清理,而将更多的时间用于生成见解。
需要注意的一点是,如果有人希望将 groupby 中的索引作为 pandas 数据框中的一个列,那么不应该使用 reset_index,而应该在 groupby 参数中使用 as_index=False。在所有这些参数中,我发现 pipe 和 assign 更友好。
你好 Subhash… 感谢您对我们讨论的贡献!