NumPy 的矢量化功能应用np.where

84 阅读3分钟

对于小型数据集而言,使用 apply 方法通常是简单而直观的。但是对于大型数据集,apply 方法可能会比较慢,因为它在每一行上都要执行一次 Python 函数调用。

在处理大型数据集时,更高效的方法是使用 Pandas 的向量化操作,尽量避免在循环中逐行处理数据。这样可以利用 Pandas 的内置功能和优化后的底层实现,提高处理速度。

一个更高效的方法是使用 np.where() 函数,它可以根据条件快速生成新列。下面是一个使用 np.where() 的示例:

import numpy as np

# 假设 df 是你的 DataFrame,包含了 "渠道" 和 "itemId" 列
# 例如:
# df = pd.DataFrame({'渠道': ['淘宝', '天猫', '淘宝', '天猫'],
#                    'itemId': [1, 2, 3, 4]})

# 假设 tb_url 和 tm_url 是根据 itemId 计算得到的 URL 函数
def tb_url(item_id):
    return f"tb.com/item/{item_id}"

def tm_url(item_id):
    return f"tmall.com/item/{item_id}"

# 使用 np.where() 方法根据条件快速生成新列
df['url'] = np.where(df['渠道'] == '淘宝', tb_url(df['itemId']), tm_url(df['itemId']))

# 打印 DataFrame
print(df)

这种方法利用了 NumPy 的矢量化功能,可以在不使用循环的情况下根据条件快速生成新列,因此在处理大型数据集时通常比 apply 方法更高效。

*****拓展,超过两种判断条件该如何处理?

示例:使用 np.select() 处理多种情况

假设我们有一个 pandas DataFrame,其中包含商品的 itemId渠道(销售渠道)。我们希望根据不同的渠道 (淘宝天猫京东),生成不同的 url

1. 示例数据

import pandas as pd
import numpy as np

# 假设有以下数据
data = {
    'itemId': [12345, 67890, 54321, 98765, 11223],
    '渠道': ['淘宝', '天猫', '京东', '淘宝', '拼多多']  # 拼多多不在规则内
}

df = pd.DataFrame(data)

# 定义不同渠道对应的 URL 生成函数
def tb_url(itemId):
    return f"https://taobao.com/item/{itemId}"

def tm_url(itemId):
    return f"https://tmall.com/item/{itemId}"

def jd_url(itemId):
    return f"https://jd.com/item/{itemId}"

# 使用 np.select 进行条件匹配
conditions = [
    df['渠道'] == '淘宝',
    df['渠道'] == '天猫',
    df['渠道'] == '京东'
]

choices = [
    tb_url(df['itemId']),
    tm_url(df['itemId']),
    jd_url(df['itemId'])
]

df['url'] = np.select(conditions, choices, default="未知渠道")

# 输出结果
print(df)

2. 运行结果

   itemId   渠道                     url
0  12345   淘宝  https://taobao.com/item/12345
1  67890   天猫  https://tmall.com/item/67890
2  54321   京东  https://jd.com/item/54321
3  98765   淘宝  https://taobao.com/item/98765
4  11223  拼多多                      未知渠道

代码解读

  1. 创建 DataFrame,包含 itemId渠道 列。

  2. 定义 tb_url()tm_url()jd_url() 作为 URL 生成函数。

  3. 使用 np.select() 进行匹配

    • conditions 存储判断条件 (df['渠道'] == 'xxx')
    • choices 存储匹配的 URL 生成结果(调用 tb_url()tm_url()jd_url())。
    • default="未知渠道" 处理不在匹配范围内的情况(例如 "拼多多")。
  4. 最终生成 url,针对不同渠道生成不同的链接。


适用场景

  • 适用于 批量数据处理,比 apply() 更快。
  • 条件多时,比 if-else 结构更清晰。

这样,我们可以在大规模数据集上高效处理不同情况,生成符合需求的 url! 🚀