目录
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)