NumPy 与 Pandas 中「有无返回值函数」的易错点整理

Anaconda加速AI模型训练 2w人浏览 15人参与

在这里插入图片描述

 【个人主页:玄同765

大语言模型(LLM)开发工程师中国传媒大学·数字媒体技术(智能交互与游戏设计)

深耕领域:大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调

技术栈:Python / LangChain/RAG(Dify+Redis+Milvus)| SQL/NumPy | FastAPI+Docker ️

工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案 

      

专栏传送门:LLM大模型开发 项目实战指南Python 从真零基础到纯文本 LLM 全栈实战​​​​​从零学 SQL + 大模型应用落地大模型开发小白专属:从 0 入门 Linux&Shell

     

「让AI交互更智能,让技术落地更高效」

欢迎技术探讨/项目合作! 关注我,解锁大模型与智能交互的无限可能!

  相关 思维导图 下载:

【免费】思维导图:Numpy知识整理.xmind资源-优快云下载

【免费】思维导图:Pandas核心知识体系.xmind资源-优快云下载

【免费】思维导图:Matplotlib数据可视化全攻略.xmind资源-优快云下载

在使用 NumPy 和 Pandas 进行数据分析和处理时,「函数是否有返回值、是否会修改原对象」是一个高频易错点 —— 很多人会因混淆这两类函数导致数据被意外修改、操作无响应或结果不正确。本文将通过功能分类表格实战代码示例,系统整理 NumPy 与 Pandas 中典型的有无返回值函数,帮助读者避免此类错误。


一、问题引入:一个真实场景的错误

假设你正在处理一份客户购买数据,需要对部分列进行归一化处理:

import pandas as pd
import numpy as np

# 生成模拟数据
data = pd.DataFrame({
    'customer_id': [1, 2, 3, 4, 5],
    'product_id': [101, 102, 101, 103, 102],
    'quantity': [5, 3, 2, 1, 4],
    'price': [10.5, 20.0, 10.5, 30.0, 20.0]
})

# 归一化quantity列
# 错误做法:直接调用DataFrame的apply方法,未赋值
data['quantity'].apply(lambda x: (x - np.min(data['quantity'])) / (np.max(data['quantity']) - np.min(data['quantity'])))

# 打印结果,发现quantity列未变化
print(data['quantity'])

错误原因DataFrame.apply()方法会返回一个新的 Series 对象,不会直接修改原列。正确做法是将返回值赋值给原列或新列。


二、NumPy 中有无返回值函数整理

NumPy 中的函数按是否修改原数组分为两类:返回新数组的函数直接修改原数组的函数(通常以_结尾,称为「原地操作函数」)。

2.1 NumPy 功能分类表格

功能分类函数名功能是否有返回值原数组是否改变代码示例
数组创建np.array从列表 / 元组创建数组arr = np.array([1, 2, 3])
np.zeros创建全零数组arr = np.zeros(5)
np.ones创建全一数组arr = np.ones(5)
形状修改arr.reshape改变数组形状new_arr = arr.reshape(2, 3)
arr.resize改变数组形状(可原地)否(无返回)是(原地修改)arr.resize(2, 3)
arr.T数组转置new_arr = arr.T
数据操作np.add数组加法(向量化)new_arr = np.add(arr1, arr2)
arr1 + arr2数组加法(运算符重载)new_arr = arr1 + arr2
arr.fill数组填充值否(无返回)是(原地修改)arr.fill(0)
np.where条件索引new_arr = np.where(arr > 0, arr, 0)
统计计算np.sum数组求和sum_result = np.sum(arr)
np.mean数组平均值mean_result = np.mean(arr)
np.max数组最大值max_result = np.max(arr)
原地操作arr += arr2原地加法否(无返回)是(原地修改)arr += arr2
arr.sort原地排序否(无返回)是(原地修改)arr.sort()
arr.flatten数组扁平化(返回拷贝)new_arr = arr.flatten()
arr.ravel数组扁平化(返回视图)new_arr = arr.ravel()

2.2 NumPy 实战易错点示例

示例 1:混淆 reshape 与 resize
import numpy as np

# 创建数组
arr = np.array([1, 2, 3, 4, 5, 6])

# reshape:返回新数组,原数组不变
new_arr1 = arr.reshape(2, 3)
print(f"reshape后原数组:{arr}")  # [1 2 3 4 5 6](未变化)
print(f"reshape后新数组:\n{new_arr1}")

# resize:原地修改,无返回值
arr.resize(2, 3)
print(f"resize后原数组:\n{arr}")  # [[1 2 3] [4 5 6]](已变化)
示例 2:混淆 sort 与 sorted
import numpy as np

# 创建数组
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])

# sorted:返回新数组,原数组不变
new_arr1 = sorted(arr)
print(f"sorted后原数组:{arr}")  # [3 1 4 1 5 9 2 6](未变化)
print(f"sorted后新数组:{new_arr1}")

# arr.sort:原地修改,无返回值
arr.sort()
print(f"arr.sort后原数组:{arr}")  # [1 1 2 3 4 5 6 9](已变化)

三、Pandas 中有无返回值函数整理

Pandas 中的函数同样分为返回新对象的函数直接修改原对象的函数(通常有inplace=True参数)。Pandas 的函数更多,我们按Series 操作DataFrame 操作分类整理。

3.1 Series 操作分类表格

功能分类函数名功能是否有返回值原对象是否改变(默认)代码示例
数据操作s.apply应用自定义函数new_s = s.apply(lambda x: x*2)
s.map应用字典 / Series / 函数new_s = s.map({1: 'A', 2: 'B'})
s.replace替换值new_s = s.replace(1, 'A')
数据过滤s[s > 0]条件过滤new_s = s[s > 0]
统计计算s.sum求和sum_result = s.sum()
s.mean平均值mean_result = s.mean()
原地操作s.fillna填充缺失值是(默认)否(默认)new_s = s.fillna(0) 或 s.fillna(0, inplace=True)
s.dropna删除缺失值是(默认)否(默认)new_s = s.dropna() 或 s.dropna(inplace=True)
s.sort_values排序是(默认)否(默认)new_s = s.sort_values() 或 s.sort_values(inplace=True)

3.2 DataFrame 操作分类表格

功能分类函数名功能是否有返回值原对象是否改变(默认)代码示例
数据操作df.apply应用自定义函数new_df = df.apply(lambda x: x*2)
df.applymap应用自定义函数到每个元素new_df = df.applymap(lambda x: str(x))
df.pipe链式操作new_df = df.pipe(lambda x: x[x['quantity'] > 0])
形状修改df.drop删除列 / 行是(默认)否(默认)new_df = df.drop('price', axis=1) 或 df.drop('price', axis=1, inplace=True)
df.rename重命名列 / 行是(默认)否(默认)new_df = df.rename({'customer_id': 'id'}, axis=1) 或 df.rename({'customer_id': 'id'}, axis=1, inplace=True)
数据过滤df[df['quantity'] > 0]条件过滤new_df = df[df['quantity'] > 0]
合并 / 拼接pd.concat合并 DataFrame/Seriesnew_df = pd.concat([df1, df2], axis=0)
pd.merge合并 DataFrame(类似 SQL)new_df = pd.merge(df1, df2, on='customer_id')
原地操作df.fillna填充缺失值是(默认)否(默认)new_df = df.fillna(0) 或 df.fillna(0, inplace=True)
df.dropna删除缺失值是(默认)否(默认)new_df = df.dropna() 或 df.dropna(inplace=True)
df.sort_values排序是(默认)否(默认)new_df = df.sort_values('quantity') 或 df.sort_values('quantity', inplace=True)

3.3 Pandas 实战易错点示例

示例 1:未使用 inplace=True 参数
import pandas as pd

# 创建DataFrame
data = pd.DataFrame({
    'customer_id': [1, 2, 3, 4, 5],
    'product_id': [101, 102, 101, 103, 102],
    'quantity': [5, 3, 2, 1, 4],
    'price': [10.5, 20.0, 10.5, 30.0, 20.0]
})

# 错误做法:直接调用drop方法,未赋值或使用inplace=True
data.drop('price', axis=1)

# 打印结果,发现price列未变化
print(data.columns)  # Index(['customer_id', 'product_id', 'quantity', 'price'], dtype='object')

# 正确做法1:赋值给新DataFrame
new_data1 = data.drop('price', axis=1)
print(new_data1.columns)  # Index(['customer_id', 'product_id', 'quantity'], dtype='object')

# 正确做法2:使用inplace=True参数
data.drop('price', axis=1, inplace=True)
print(data.columns)  # Index(['customer_id', 'product_id', 'quantity'], dtype='object')
示例 2:混淆 apply 与 applymap
import pandas as pd
import numpy as np

# 创建DataFrame
data = pd.DataFrame({
    'customer_id': [1, 2, 3, 4, 5],
    'product_id': [101, 102, 101, 103, 102],
    'quantity': [5, 3, 2, 1, 4],
    'price': [10.5, 20.0, 10.5, 30.0, 20.0]
})

# apply:应用到列(默认axis=0)或行(axis=1)
total_price = data.apply(lambda x: x['quantity'] * x['price'] if x.name == 'total' else x, axis=0)  # 错误用法,apply默认作用于列
total_price = data.apply(lambda x: x['quantity'] * x['price'], axis=1)  # 正确用法,作用于行
data['total_price'] = total_price
print(data['total_price'])

# applymap:应用到每个元素
data_str = data.applymap(lambda x: str(x))
print(data_str.dtypes)  # 所有列都是object类型

四、总结

通过本文的整理,我们可以看出 NumPy 与 Pandas 中「有无返回值函数」的规律:

  1. NumPy:大部分函数会返回新数组,不会修改原数组;原地操作函数通常以_结尾,无返回值,会直接修改原数组。
  2. Pandas:大部分函数会返回新对象,不会修改原对象;原地操作需要使用inplace=True参数,使用后无返回值,会直接修改原对象。

在实际开发中,我们应该:

  1. 优先使用返回新对象的函数,这样可以保留原数据,便于调试和错误恢复。
  2. 如果需要节省内存或必须修改原对象,可以使用原地操作函数,但要确保操作的正确性。
  3. 对不熟悉的函数,可以先查看官方文档或进行小范围测试,确认其是否有返回值、是否会修改原对象。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值