Pandas库:(四)数组对象的增删改操作

发布于:2025-02-22 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

新增数据

concat追加数据(增加行数据)

insert插入数据(增加列数据)

删除数据

drop()删除指定行或列

drop_duplicates删除重复的行

修改数据

使用loc索引修改

数组对象.列名

replace替换

修改行列索引名


import pandas as pd

data1 = {
    '语文': [0, 19, 9, 28, 91, 56],
    '数学': [64, 81, 80, 17, 37, 52],
    '英语': [40, 25, 45, 58, 67, 57]
}

data2 = {
    '化学': [32, 38, 7, 12, 33, 28],
    '物理': [69, 43, 44, 62, 3, 67],
    '体育': [93, 7, 77, 95, 40, 89],
    '科目': ['科一', '科二', '科三', '科四', '科五', '科六']
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2, index=["a", "b", "c", "d", "e", "f"])

新增数据

concat追加数据(增加行数据)

在 Pandas 中,append() 方法用于将一个 DataFrame 或 Series 的数据追加到另一个 DataFrame 的末尾。从 Pandas 2.0.0 开始,append() 方法已被弃用,而是使用 pd.concat() 方法来实现相同的功能。

def concat(
    objs: Iterable[Series | DataFrame] | Mapping[HashableT, Series | DataFrame],
    *,
    axis: Axis = 0,
    join: str = "outer",
    ignore_index: bool = False,
    keys: Iterable[Hashable] | None = None,
    levels=None,
    names: list[HashableT] | None = None,
    verify_integrity: bool = False,
    sort: bool = False,
    copy: bool | None = None,
) -> DataFrame | Series:

常用参数说明:

ignore_index=True :是否生成新的索引,新索引使用系统默认的整型索引。

axis=0:表示沿着指定的轴拼接(默认为0,表示行方向;1时表示为列方向)。

result1 = pd.concat([df1, df2], ignore_index=False)
result2 = pd.concat([df1, df2], axis=0)
print(result1)
print(result2)
insert插入数据(增加列数据)
    def insert(
        self,
        loc: int,
        column: Hashable,
        value: Scalar | AnyArrayLike,
        allow_duplicates: bool | lib.NoDefault = lib.no_default,
    ) -> None:

 参数说明:

  • loc: 插入位置的索引(从 0 开始)。例如,loc=0 表示在第一列插入,loc=1 表示在第二列插入,以此类推。

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

  • value: 要插入的数据。可以是一个标量值、列表、NumPy 数组或 Series 对象。

  • allow_duplicates: 是否允许插入重复的列名。默认为 False,即不允许重复列名。

print(df1)
value = [80, 38, 70, 51, 33, 48]
df1.insert(loc=2, column='生物', value=value)
print(df1)

删除数据

drop()删除指定行或列

在 Pandas 中,drop() 方法用于删除 DataFrame 或 Series 中的行或列。它是一个非常常用的数据清理工具,可以根据索引或标签删除指定的行或列。

    def drop(
        self,
        labels: IndexLabel | None = None,
        *,
        axis: Axis = 0,
        index: IndexLabel | None = None,
        columns: IndexLabel | None = None,
        level: Level | None = None,
        inplace: bool = False,
        errors: IgnoreRaise = "raise",
    ) -> DataFrame | None:

drop() 方法的常用参数:

参数 描述
labels 要删除的行或列的标签(可以是单个标签或列表)。使用labels时最好指定axis参数来说明要删除行或列,否则找不到对应的索引会报错,也可使用errors参数来绕过报错。但还是推荐使用index和columns参数来删除。
axis 删除方向:0 表示删除行(默认),1 表示删除列。
index 直接指定要删除的行(替代 labels 和 axis=0)。
columns 直接指定要删除的列(替代 labels 和 axis=1)。
inplace 是否原地修改 DataFrame。默认为 False,返回一个新对象。选择True时,修改后原数据会直接被修改。
errors 如果指定的标签不存在,是否抛出错误。默认为 'raise',可选 'ignore'errors='ignore' 可以忽略不存在的标签。
print(df2.drop('a', axis=0))  # 指定一行删除
print(df2.drop(['a', 'b'], axis=0))  # 指定多行删除
print(df2.drop('化学', axis=1))  # 指定一列删除
print(df2.drop(['科目', '化学'], axis=1))  # 指定多列删除

print(df2.drop(index=['a', 'b'], columns=['科目', '化学', '美术'], errors='ignore'))  # 删除指定的行和列

使用inplace参数修改源数据

df2.drop(index=['a', 'b'], columns=['科目', '化学', '美术'], errors='ignore', inplace=True)
print(df2)
drop_duplicates删除重复的行
    def drop_duplicates(
        self,
        subset: Hashable | Sequence[Hashable] | None = None,
        *,
        keep: DropKeep = "first",
        inplace: bool = False,
        ignore_index: bool = False,
    ) -> DataFrame | None:

参数说明:

Keep:支持'first', 'last', ``False``,默认为first,表示要保留的数据,False是表示都不保留。

ignore_index:是否生成新的索引,新索引使用系统默认的整型索引。

inplace:是否原地修改 DataFrame。默认为 False,返回一个新对象。选择True时,修改后原数据会直接被修改。

data3 = {
    '语文': [0, 9, 2, 5, 3, 3, 5],
    '数学': [6, 8, 1, 5, 3, 3, 5],
    '英语': [4, 4, 5, 5, 3, 3, 5]
}
df3 = pd.DataFrame(data3)
print(df3)
print(df3.drop_duplicates())

修改数据

使用loc索引修改

一维数组对象的修改

s = pd.Series({"李": 82, "陈": 93, "张": 91, "曾": 78, "邓": 68})
s['曾'] = 999
print(s)

二维数组对象的修改

df3.loc[2] = [1, 7, 3]   # 修改一行数据

df3.loc[2, '语文'] = 1000  # 修改单个数据
数组对象.列名
s = pd.Series({"李": 82, "陈": 93, "张": 91, "曾": 78, "邓": 68})
s.曾 = 999

# 二维数组
df3.语文 = [1, 7, 3, 977, 0, 8, 9]  # 修改列数据
replace替换

在 Pandas 中,replace() 方法用于替换 DataFrame 或 Series 中的值。它可以替换单个值、列表中的多个值、正则表达式匹配的值,甚至可以使用字典指定复杂的替换规则。replace() 是一个非常灵活且强大的工具,常用于数据清洗和预处理。

    def replace(
        self,
        to_replace=None,
        value=lib.no_default,
        *,
        inplace: bool_t = False,
        limit: int | None = None,
        regex: bool_t = False,
        method: Literal["pad", "ffill", "bfill"] | lib.NoDefault = lib.no_default,
    ) -> Self | None:

replace() 方法的常用参数:

参数 描述
to_replace 需要替换的值(可以是单个值、列表、字典或正则表达式)。
value 替换后的值(可以是单个值或列表)。
inplace 是否原地修改 DataFrame。默认为 False,返回一个新对象。
limit 替换的最大次数。
regex 是否将 to_replace 解释为正则表达式。默认为 False
method 替换方法:'pad'(向前填充)或 'ffill'(向后填充)。
df3.replace(3, 333)  # 替换单个值
df3.replace([3, 9], [333, 999])  # 替换多个值

1、使用字典替换指定列的指定值

print(df3)
print(df3.replace({'语文': {2: 20, 0: 100}, '数学': {5: 50}}))

2、正则表达式匹配要修改的内容

data3 = {
    '语文': [0, 9, 2, 5, 3, 3, 5],
    '数学': [6, 8, 's', 5, 3, 3, 5],
    '英语': [4, 4, 5, 5, 3, 3, 'u']
}
df3 = pd.DataFrame(data3)
print(df3)

print(df3.replace(to_replace=r'[us]', value='x', regex=True))

3、替换缺失值

import numpy as np

# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, 7, 8],
    'C': ['p', 'q', 'r', 's']
})
print(df)

df_replaced = df.replace(np.nan, 0)
print(df_replaced)

修改行列索引名

pandas 中的 rename 方法用于重命名 DataFrame 或 Series 的轴标签(即行索引或列名)。它可以灵活地修改行索引或列名,并且可以选择是否直接修改原始对象。

DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='ignore')

参数:

  • mapper: 用于重命名的字典或函数。可以是一个字典(如 {'old_name': 'new_name'})或一个函数(如 str.upper)。

  • index: 重命名行索引的字典或函数。

  • columns: 重命名列名的字典或函数。

  • axis: 指定要重命名的轴。0 或 'index' 表示行索引,1 或 'columns' 表示列名。默认为 None,表示根据 mapper 推断。

  • copy: 是否返回一个新的对象。默认为 True

  • inplace: 是否直接修改原始对象。默认为 False

  • level: 如果轴是多级索引(MultiIndex),则指定要重命名的级别。

  • errors: 如何处理未找到的键。'ignore'(默认)表示忽略未找到的键,'raise' 表示抛出异常。

data3 = {
    '语文': [0, 9, 2, 5],
    '数学': [6, 8, 3, 8],
    '英语': [4, 4, 5, 5]
}
df3 = pd.DataFrame(data3)
print(df3)

df3.rename(columns={'语文': 'Yu', '数学': 'shu'}, inplace=True)  # 重命名指定列索引名
df3.rename(index={0: 'row1', 1: 'row2'}, inplace=True)  # 重命名指定行索引名
df3.rename(columns=str.upper, inplace=True)  # 使用函数重命名,将列名转大写
print(df3)

重命名多级索引的列:如果 DataFrame 有多级列名(MultiIndex),可以指定 level 参数来重命名某一级别。

df = pd.DataFrame({
    ('A', 'a1'): [1, 2, 3],
    ('A', 'a2'): [4, 5, 6],
    ('B', 'b1'): [7, 8, 9]
})
print(df)

df.rename(columns={'a1': 'x1', 'a2': 'x2'}, level=1, inplace=True)
print(df)