对于小型数据集而言,使用 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 拼多多 未知渠道
代码解读
-
创建
DataFrame,包含itemId和渠道列。 -
定义
tb_url()、tm_url()和jd_url()作为 URL 生成函数。 -
使用
np.select()进行匹配conditions存储判断条件 (df['渠道'] == 'xxx')choices存储匹配的 URL 生成结果(调用tb_url()、tm_url()、jd_url())。default="未知渠道"处理不在匹配范围内的情况(例如"拼多多")。
-
最终生成
url列,针对不同渠道生成不同的链接。
适用场景
- 适用于 批量数据处理,比
apply()更快。 - 条件多时,比
if-else结构更清晰。
这样,我们可以在大规模数据集上高效处理不同情况,生成符合需求的 url! 🚀