当前位置: 首页 > news >正文

一周学会Pandas2 Python数据处理与分析-Pandas2数据添加修改删除操作

锋哥原创的Pandas2 Python数据处理与分析 视频教程:  

2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

对数据的修改、增加和删除在数据整理过程中时常发生。修改的情况一般是修改错误,还有一种情况是格式转换,如把中文数字修改为阿拉伯数字。修改也会涉及数据的类型修改。 删除一般会通过筛选的方式,筛选完成后将最终的结果重新赋值给变量,达到删除的目的。增加行和列是最为常见的操作,数据分析过程中会计算出新的指标以新列展示。

修改数据值操作

在Pandas中修改数值非常简单,先筛选出需要修改的数值范围,再 为这个范围重新赋值。

下面是示例:

import pandas as pddf = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df.iloc[0, 0]='老六' # 修改数据
df.loc[df.语文分数 < 60, '语文分数'] = 60 # 指定范围修改数据

以上操作df变量的内容被修改,这里指定的是一个定值,所有满足条件的数据均被修改为这个定值。还可以传一个同样形状的数据来修改值:

看下示例:

import pandas as pddata = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],'Age': [25, 30, 22, 28],'Score': [85, 95, 75, 88]
}
df = pd.DataFrame(data)
v = [100, 100, 100, 100]
df.Score = v

替换数据replace()操作

pandas的replace()方法是用于替换DataFrame或Series中的值的灵活工具。以下是其使用方法的详细介绍:

1,方法定义

replace() 方法的语法如下:

DataFrame.replace(to_replace=None,       # 要替换的值(支持多种格式)value=None,            # 替换后的值inplace=False,         # 是否原地修改limit=None,            # 最大替换次数regex=False,           # 是否启用正则表达式method=None            # 填充方法(已弃用)
)

2,核心参数详解

to_replace(必选)

  • 功能:指定需要被替换的内容。

  • 支持类型

    • 标量:单个值(如 0)。

    • 列表:多个值(如 [0, 1])。

    • 字典

      • {old_val: new_val}:全局替换(所有列)。

      • {column: {old_val: new_val}}:按列指定替换规则。

    • 正则表达式:需设置 regex=True

value(可选)

  • 功能:替换后的新值,默认 None

  • 规则

    • to_replace 是标量或列表,value 可以是单个值或与 to_replace 等长的列表。

    • to_replace 是字典,value 通常被忽略(直接在字典中定义新旧值)。

regex(布尔值,默认 False)

  • 功能:是否将 to_replace 视为正则表达式模式。

  • 示例

    # 将包含数字的字符串替换为 'X'
    df.replace(to_replace=r'\d+', value='X', regex=True)

inplace(布尔值,默认 False)

  • 功能:若为 True,直接修改原对象,不返回新对象;否则返回替换后的副本。

limit(整数,默认 None)

  • 功能:限制连续替换的最大次数(适用于相邻重复值的替换场景)。

3,使用场景与示例

简单值替换:

import pandas as pd
import numpy as np# 示例数据
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': ['a', 'b', 'c', 'd'],'C': [0, 1, np.nan, 1]
})# 将 0 替换为 -1(全局)
df.replace(0, -1)# 将 0 和 1 替换为 -1 和 -2
df.replace([0, 1], [-1, -2])# 按列替换:A列的1替换为100,C列的0替换为-1
df.replace({'A': {1: 100}, 'C': {0: -1}})

正则表达式替换:

import pandas as pd# 将字符串中的数字替换为 'X'
df = pd.DataFrame({'Text': ['A1', 'B2', 'C3']})
df.replace(to_replace=r'\d', value='X', regex=True)
# 输出:
#   Text
# 0   AX
# 1   BX
# 2   CX

缺失值处理:

import pandas as pd
import numpy as np
​
# 示例数据
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': ['a', 'b', 'c', 'd'],'C': [0, 1, np.nan, 1]
})
# 将 NaN 替换为 0
df.replace(np.nan, 0)

多值嵌套字典替换:

import pandas as pd
import numpy as np# 示例数据
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': ['a', 'b', 'c', 'd'],'C': [0, 1, np.nan, 1]
})
# 多层字典结构:不同列使用不同规则
df.replace({'A': {1: 100, 2: 200},  # A列:1→100,2→200'B': {'a': 'Alpha'}  # B列:a→Alpha
})

混合类型替换:

import pandas as pd
import numpy as np
​
# 示例数据
df = pd.DataFrame({'A': [1, 2, 3, 4],'B': ['a', 'b', 'c', 'd'],'C': [0, 1, np.nan, 1]
})
# 同时替换数值和字符串
df.replace({0: 'Zero',  # 全局将0替换为'Zero''a': 'Alpha'  # 全局将'a'替换为'Alpha'
})

空值填充fillna()操作

pandasfillna() 方法是处理缺失值(NaN或None)的核心工具,用于填充或替换数据中的空值。以下是其定义、参数详解及常见使用场景的完整指南:

1,方法定义

DataFrame.fillna(value=None,           # 填充值(标量、字典、Series或DataFrame)method=None,          # 填充方法:'ffill'(向前填充)、'bfill'(向后填充)axis=None,            # 填充方向:0(沿行,默认),1(沿列)inplace=False,        # 是否原地修改limit=None,           # 最大连续填充次数downcast=None         # 自动向下转换数据类型(可选)
)

2,核心参数详解

value

  • 功能:指定填充缺失值的具体内容。

  • 支持类型

    • 标量:如 0"missing"

    • 字典:按列指定填充值(键为列名)。

    • Series/DataFrame:对齐索引后填充(需形状匹配)。

method

  • 功能:选择填充策略,与 value 互斥(不能同时使用)。

    • 'ffill' / 'pad':用前一个非空值填充。

    • 'bfill' / 'backfill':用后一个非空值填充。

axis

  • 功能:控制填充方向:

    • axis=0axis='index':按行填充(默认)。

    • axis=1axis='columns':按列填充。

limit

  • 功能:限制连续填充的最大次数(如 limit=2 表示最多填充连续2个NaN)。

inplace

  • 功能:若为 True,直接修改原对象,否则返回新对象。

3,使用场景

用固定值填充

import pandas as pd
import numpy as np
​
# 示例数据
df = pd.DataFrame({'A': [1, np.nan, 3, np.nan],'B': ['x', np.nan, 'y', np.nan],'C': [np.nan, 5, np.nan, 7]
})
​
# 所有NaN填充为0
df.fillna(0)
​
# 按列指定填充值(A列填0,B列填'missing')
df.fillna({'A': 0, 'B': 'missing'})

向前/向后填充

# 向前填充(用前一个非空值)
df.fillna(method='ffill')# 向后填充(用后一个非空值)
df.fillna(method='bfill')

限制填充次数

# 最多连续填充2个NaN
df.fillna(value='Q', limit=2)

增加列操作

增加列是数据处理中最常见的操作,Pandas可以像定义一个变量一 样定义DataFrame中新的列,新定义的列是实时生效的。与数据修改的逻辑一样,新列可以是一个定值,所有行都为此值,也可以是一个同等长度的序列数据,各行有不同的值。接下来我们增加总成绩total列:

import pandas as pddf = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df['总分'] = df.语文分数 + df.数学分数 + df.英语分数

我们也可以用insert()方法在指定位置插入列。

方法定义:

DataFrame.insert(loc,               # 插入位置的索引(从0开始)column,            # 新列的名称value,             # 新列的数据(标量、数组、Series等)allow_duplicates=False  # 是否允许列名重复(默认不允许)
)

核心参数说明

  • loc:插入位置的整数索引(如 0 表示第一列前)。

  • column:新列的名称(字符串)。

  • value:新列的数据,可以是标量、列表、NumPy 数组、Series 等。

  • allow_duplicates:若为 True,允许插入与现有列同名的列(默认 False 会触发错误)。

我们在第5列插入总分字段

import pandas as pddf = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df.insert(4, '总分', df.语文分数 + df.数学分数 + df.英语分数)  # 在第5列插入总分字段

还有一个assign()方法,pandasassign() 方法是 链式操作(Method Chaining) 中的核心工具,用于动态添加新列或覆盖现有列,不修改原 DataFrame,而是返回一个新的 DataFrame。它特别适合在数据处理流程中优雅地添加多列或进行复杂计算。以下是其详细使用指南:

方法定义:

DataFrame.assign(**kwargs) -> DataFrame

参数kwargs 是以列名为键的键值对,值可以是:

  • 标量、列表、数组、Series。

  • 一个函数(如 lambda),参数为当前 DataFrame。

返回值:返回包含新列的新 DataFrame,原 DataFrame 不变。

特点:支持动态列名、链式调用,适合函数式编程。

我们动态添加一个总分列:

import pandas as pd
​
df = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df_new = df.assign(总分=df.语文分数 + df.数学分数 + df.英语分数)

最后再介绍一个eval()方法,可以以字符串的形式传入表达式,增加列数据。我们还是以增加总分示例来学习下:

import pandas as pddf = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df.eval('总分=语文分数 + 数学分数 + 英语分数')

eval()方法定义:

DataFrame.eval(expr,              # 表达式字符串(必填)inplace=False,     # 是否原地修改(默认为False)**kwargs           # 其他参数(如engine, target等)
)

核心参数:

expr: 要执行的表达式字符串(例如 "A + B")。

inplace: 若为 True,直接修改原 DataFrame;若为 False,返回新对象(默认)。

engine: 计算引擎('numexpr''python'),默认自动选择。

target: 指定计算结果存储的列名或位置(可选)。

增加行操作

可以使用loc[]指定索引给出所有列的值来增加一行数据。

import pandas as pd
​
df = pd.read_excel('student_scores.xlsx')  # 读取excel,返回DataFrame数据集对象
df.loc[100] = ['老六', 'S1111', '1999-11-11', '男', 10, 10, 10]

还可以指定列,无数据的列值为NaN

df.loc[101] = {'姓名': '老七', '学号': 'S11122', '性别': '男'}

自动增加索引

df.loc[len(df)] = {'姓名': '老八', '学号': 'S11123', '性别': '女'}

追加合并concat()操作

pandasconcat() 方法是用于 沿指定轴(行或列)合并多个 DataFrame 或 Series 的核心工具,支持灵活的数据拼接逻辑。

方法定义:

pd.concat(objs,                # 要合并的对象列表(如[df1, df2])axis=0,              # 合并方向:0(行方向,默认)或1(列方向)join='outer',        # 合并方式:'outer'(并集)或 'inner'(交集)ignore_index=False,  # 是否忽略原索引(默认保留)keys=None,           # 创建分层索引(标识来源)names=None,          # 分层索引的名称verify_integrity=False,  # 检查索引是否重复sort=False           # 是否对列名排序(默认不排序)
) -> DataFrame/Series

纵向堆叠(行合并)示例:

import pandas as pd# 示例数据
df1 = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']})
df2 = pd.DataFrame({'A': [3, 4], 'B': ['z', 'w']})# 沿行方向合并(默认axis=0)
result = pd.concat([df1, df2], ignore_index=True)
print(result)

横向拼接(列合并)示例:

df3 = pd.DataFrame({'C': [10, 20], 'D': [True, False]})# 沿列方向合并(axis=1)
result = pd.concat([df1, df3], axis=1)

行列删除drop()和pop()操作

pandaspop() 方法用于从 DataFrame 或 Series 中删除指定的列或元素,并返回被删除的数据。该方法直接修改原对象(原地操作),适合需要移除数据并立即使用该数据的场景。以下是详细的使用指南:

方法定义:

# DataFrame 的 pop 方法
DataFrame.pop(item: str) -> Series# Series 的 pop 方法
Series.pop(item: Hashable) -> Any

参数说明

  • item:要删除的列名(DataFrame)或索引标签(Series)。

  • 返回值:被删除的列(Series)或元素(标量)。

删除列示例:

import pandas as pd# 创建示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3],'B': ['x', 'y', 'z'],'C': [10, 20, 30]
})# 删除并返回列 'B'
popped_column = df.pop('B')print("删除后的 DataFrame:")
print(df)
print("\n被删除的列:")
print(popped_column)

pop()方法只能删除列。我们在学习下drop()方法,行列都能删除。

pandasdrop() 方法是用于从 DataFrame 或 Series 中删除指定行或列的核心工具。它支持通过标签或索引位置删除数据,并提供了灵活的参数控制。

方法定义:

DataFrame.drop(labels=None,          # 要删除的行/列标签(单个或列表)axis=0,               # 删除方向:0(行,默认)或 1(列)index=None,           # 直接指定行标签(替代 axis=0)columns=None,         # 直接指定列标签(替代 axis=1)level=None,           # 多级索引的层级(针对分层索引)inplace=False,        # 是否原地修改(默认返回新对象)errors='raise'        # 错误处理:'raise'(报错)或 'ignore'
) -> DataFrame | None

删除列示例:

import pandas as pd# 创建示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3],'B': ['x', 'y', 'z'],'C': [10, 20, 30]
})# 删除单列(两种等价写法)
df_dropped = df.drop(columns='B')        # 写法1:columns参数
df_dropped = df.drop(labels='B', axis=1) # 写法2:labels + axis=1# 删除多列
df_dropped = df.drop(columns=['B', 'C'])

删除行示例:

# 删除单行(按行标签)
df_dropped = df.drop(index=0)        # 删除索引为0的行
df_dropped = df.drop(labels=0, axis=0) # 等价写法# 删除多行(按标签或位置)
df_dropped = df.drop(index=[0, 2])   # 删除索引为0和2的行
df_dropped = df.drop([0, 2], axis=0) # 等价写法

pop()和drop()方法对比

方法操作对象返回值修改原对象常用场景
pop()列或元素被删除的数据需要立即使用被删除的数据
drop()行或列新对象(默认)否(需inplace=True保留原数据,生成新对象

删除空值dropna()操作

dropna方法是pandas中处理缺失值的重要工具,用于删除包含缺失值(NaN或None)的行或列。它在数据清洗阶段非常有用,能帮助我们快速移除不完整的数据记录。以下是dropna方法的详细使用说明:

方法定义:

DataFrame.dropna(axis=0,             # 操作方向:0或'index'(删除行),1或'columns'(删除列)how='any',          # 删除条件:'any'(存在缺失即删),'all'(全为缺失才删)thresh=None,        # 非缺失值的最小数量(阈值)subset=None,        # 指定检查的列(行)子集inplace=False       # 是否直接修改原数据(默认返回新对象)
)

参数解析

  • axis:默认为0,即删除包含缺失值的行。设为1或'columns'时删除列。

  • how:默认'any',只要有一个缺失值就删除。设为'all'时,只有整行(或列)全为缺失值才删除。

  • thresh:设置保留非缺失值的最小数量。例如,thresh=2表示某行至少要有2个非缺失值才保留。

  • subset:指定要检查缺失的列(当axis=0时)或行(当axis=1时)。其他位置的缺失值不影响删除操作。

  • inplace:设为True时直接修改原数据,返回None;否则返回新对象。

示例数据:

import pandas as pd
import numpy as npdata = {'A': [1, np.nan, 3, 4],'B': [np.nan, 2, np.nan, 5],'C': [7, 8, 9, 10]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)

1,默认删除包含缺失值的行

# 删除所有含有NaN的行
df_cleaned = df.dropna()
print("删除含有NaN的行:")
print(df_cleaned)

2,删除全为缺失值的行

# 添加一行全为NaN的数据
df.loc[4] = [np.nan, np.nan, np.nan]# 删除全为NaN的行
df_cleaned = df.dropna(how='all')
print("删除全为NaN的行:")
print(df_cleaned)

3,按阈值保留数据(thresh参数)

# 保留至少有2个非NaN值的行
df_cleaned = df.dropna(thresh=2)
print("保留至少2个非NaN值的行:")
print(df_cleaned)

4,仅检查指定列的缺失值(subset参数)

# 只在列A和B中检查缺失值,列C的NaN不影响结果
df_cleaned = df.dropna(subset=['A', 'B'])
print("仅检查A和B列的缺失值:")
print(df_cleaned)

相关文章:

  • 数据结构与算法-线性表-循环链表(Circular Linked List)
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色常量QColorConstants)
  • 关于软件测试开发的一些有趣的知识
  • 使用Python和Selenium打造一个全网页截图工具
  • 使用Maven和Ant上传文件到Linux服务器
  • Linux面试题集合(1)
  • C语言输入函数对比解析
  • 线性回归策略
  • STM32实战指南:SG90舵机控制原理与代码详解
  • javaDoc
  • 基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作
  • STM32IIC协议基础及Cube配置
  • 小刚说C语言刷题—1230蝴蝶结
  • 虚拟主播肖像权保护,数字时代的法律博弈
  • 5.27本日总结
  • BiliTools v1.3.7 哔哩哔哩工具箱
  • QT+EtherCAT 主站协议库—SOEM主站
  • 机械元件杂散光难以把控?OAS 软件案例深度解析
  • 使用Python绘制Lorenz奇异吸引子轨道
  • 探秘 Java 字节缓冲流:解锁高效 IO 操作的进阶之路
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • 美联储官员:美国经济增速可能放缓,现行关税政策仍将导致物价上涨
  • 陕西省市监局通报5批次不合格食品,涉添加剂超标、微生物污染等问题
  • 关税互降后的外贸企业:之前暂停的订单加紧发货,后续订单考验沟通谈判能力
  • 上海虹桥国际咖啡文化节开幕,推出茶咖文化特色街区、宝妈咖啡师培训
  • 专家:家长要以身作则,孩子是模仿者学习者有时也是评判者