You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中应用函数创建列并赋值以避免切片副本警告?

解决DataFrame应用函数生成新列的警告问题

你的原始DataFrame如下:

import pandas as pd

df = pd.DataFrame({
    'Server': ['Server1dc', 'server2dc', 'server4uat'],
    'Model': ['xp2', 'cc4', 'dd4']
})

使用apply调用total_slot函数时出现的"A value is trying to be set on a copy of a slice from a dataframe"警告,大多是因为当前df是其他DataFrame的切片副本。以下是几种更高效且能避免警告的实现方式:

方法1:使用np.select(推荐,向量化操作更高效)

向量化操作比逐行apply的性能更优,同时能规避副本警告:

import numpy as np

# 定义匹配条件与对应返回值
conditions = [
    df['Model'].str.contains('xp'),
    df['Model'].str.contains('cc')
]
values = [5, 10]

# 设置默认值为0,生成新列
df['total_slots'] = np.select(conditions, values, default=0)

方法2:使用map结合自定义映射逻辑

将规则封装为lambda函数,通过map仅对Model列处理,代码更简洁:

slot_mapper = lambda model: 5 if 'xp' in model else 10 if 'cc' in model else 0
df['total_slots'] = df['Model'].map(slot_mapper)

方法3:从根源消除副本警告

如果df是由其他DataFrame切片生成的,先创建完整副本再执行操作:

# 先创建df的独立副本
df = df.copy()

# 保留你的原始函数并应用
def total_slot(row):
    if "xp" in row["Model"]:
        return 5
    if "cc" in row["Model"]:
        return 10
    return 0

df['total_slots'] = df.apply(total_slot, axis=1)

方法4:针对单列使用apply

仅对Model列应用函数,而非整行,减少不必要的行数据处理:

def get_total_slot(model):
    if 'xp' in model:
        return 5
    elif 'cc' in model:
        return 10
    else:
        return 0

df['total_slots'] = df['Model'].apply(get_total_slot)

无论使用哪种方法,最终都会得到符合需求的DataFrame:

Server Model  total_slots
0    Server1dc   xp2            5
1    server2dc   cc4           10
2   server4uat   dd4            0

内容的提问来源于stack exchange,提问作者user1471980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:42:27