Code - pandas知识点练习

from string import printable
import pandas as pd
import numpy as np
from sympy import primenu

Series 核心概念与操作

Series 是带标签的一维数组,可理解为“单列表格”,包含两个部分:

- values:数据本身(可是数值、字符串、布尔值等);

- index:标签(默认是 0、1、2... 整数索引,也可自定义)。

1. 创建 Series(默认整数索引)

s1 = pd.Series([10, 20, 30, 40])
print("默认索引的 Series:")
print(s1) ## 输出包含 index 和 values,dtype 是数据类型(此处为 int64)

2. 自定义索引

s2 = pd.Series([10, 20, 30, 40, 50], index=["a", "b", "c", "d", "e"])
print("n自定义索引的 Series:")
print(s2)

3. 从字典创建 Series(字典的键作为索引,值作为数据)

dict_data = {"香蕉": 3.5, "苹果": 2.5, "橙子": 3.3}
s3 = pd.Series(dict_data)
print(s3)

4. 访问 Series 数据

print(s3["香蕉"]) # 按索引访问 #3.5
print(s3.iloc[1]) # 按位置访问 #2.5
print(s3.head(3)) # 前3行

5. Series 基本属性

print(s3.index) # 获取索引
print(s3.values) # 获取值 返回Numpy
print(s3.dtype) # 获取值类型
print(len(s3)) # 获取长度

DataFrame 核心概念与操作

DataFrame 是带标签的二维表格数据结构,可理解为“Excel 工作表”,包含:

- 行索引(index):每行的标签;

- 列索引(columns):每列的标签;

- 数据(values):表格中的具体内容。

1. 从字典创建 DataFrame(字典的键为列名,值为列数据)

data = {

"姓名": ["张三", "李四", "王五", "赵六"],
"年龄": [22, 25, 23, 24],
"性别": ["男", "男", "女", "男"],
"薪资": [8000, 9500, 8800, 10000],

}

df = pd.DataFrame(data)
print("默认索引的 DataFrame:")
print(df)

2. 自定义行索引

df2 = pd.DataFrame(data, index=["员工1", "员工2", "员工3", "员工4"])
print(df2)

3. 从列表嵌套列表创建 DataFrame(需指定列名)

list_data = [

["张三", 22, "男", 8000],
["李四", 25, "男", 9500],
["王五", 23, "女", 8800],

]
df3 = pd.DataFrame(list_data, columns=["姓名", "年龄", "性别", "薪资"])

4. DataFrame 基本属性

print(df2.index) # 获取行索引
print(df2.columns) # 获取列索引
print(df2.values) # 获取数据

5. 访问列数据(两种方式)

print("n访问 '薪资' 列(方式1):")
print(df2["薪资"]) # 返回 Series 类型
print("访问 '姓名' 列(方式2,仅列名无空格时可用):")
print(df2.姓名)

CSV 文件读写(最常用)

读取 CSV

csvdf = pd.read_csv("test.csv", encoding="utf-8")

print("读取的 CSV 数据:")

print(csvdf.head())

示例2:读取无表头的 CSV,指定列名

df_no_header = pd.read_csv(

"no_header_data.csv",

header=None,

names=["姓名", "年龄", "性别", "薪资"],

encoding="gbk",

)

print("n无表头 CSV 读取结果:")

print(df_no_header)

写入 CSV

df2.to_csv(

"output_employee.csv", index=False, encoding="utf-8", na_rep="未知" # 不写入行索引

)

查看与探索数据(head, info, describe 等)

ndata = {

"订单ID": [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
"用户ID": [1, 2, 1, 3, 2, 3, 4, 4],
"商品类别": [
    "家电",
    "服饰",
    "家电",
    "食品",
    "服饰",
    "食品",
    "家电",
    np.nan,
],  # np.nan 表示缺失值
"订单金额": [2999, 599, 1299, 89, 799, 159, 3499, 1999],
"订单日期": [
    "2026-01-01",
    "2026-01-02",
    "2026-01-02",
    "2026-01-03",
    "2026-01-03",
    "2026-01-04",
    "2026-01-04",
    "2026-01-05",
],
"支付状态": [
    "已支付",
    "已支付",
    "未支付",
    "已支付",
    "已支付",
    "未支付",
    "已支付",
    "已支付",
],

}
df = pd.DataFrame(ndata)

查看数据前/后几行(head/tail)

print("前 3 行数据:")
print(df.head(3))
print("n后 2 行数据:")
print(df.tail(2))

查看数据基本信息(info)

print(df.info())

查看数值型数据统计特征(describe)

print("数值型数据统计特征:")
print(df.describe())

统计所有列(包括字符串列)的唯一值数量、最频繁值等

print("n所有列的统计特征:")
print(

df.describe(include="all")

) # 无字符串列统计:默认仅统计数值型列,需指定 include="all" 才会包含字符串列。

查看缺失值与唯一值

print("每列缺失值数量:")
print(df.isnull().sum())

2. 查看每列唯一值数量(nunique())

print("n每列唯一值数量:")
print(df.nunique())

3. 查看指定列的唯一值(unique())

print("n商品类别唯一值:")
print(df["商品类别"].unique())

4. 查看指定列唯一值的计数(value_counts())

print("n各商品类别订单数量:")
print(df["商品类别"].value_counts()) # 忽略缺失值,默认按计数降序排列

查看数据形状与列名

查看数据形状(行数, 列数)

print("数据形状:", df.shape) # 输出 (8,6)

查看列名

print("列名列表:", df.columns.tolist()) # 转为列表格式,便于后续处理

查看行索引

print("行索引:", df.index.tolist())

索引与选择(loc, iloc, 条件筛选)

按标签选择(loc)

loc 基于行索引标签和列名选择数据,语法:df.loc[行标签, 列名],支持单个标签、标签列表、切片(包含终点)。

沿用第4章的订单数据,先自定义行索引(便于演示标签选择)

df = pd.DataFrame(

{
    "订单ID": [1001, 1002, 1003, 1004, 1005],
    "商品类别": ["家电", "服饰", "家电", "食品", "服饰"],
    "订单金额": [2999, 599, 1299, 89, 799],
    "支付状态": ["已支付", "已支付", "未支付", "已支付", "已支付"],
},
index=["订单1", "订单2", "订单3", "订单4", "订单5"],

) # 自定义行标签

print("选择 '订单2' 行:")
print(df.loc["订单2"])

2. 选择多个行(标签列表)

print("n选择 '订单1' 和 '订单4' 行:")
print(df.loc[["订单1", "订单4"]])

3. 选择行切片(包含起点和终点)

print("n选择 '订单2' 到 '订单4' 行:")
print(df.loc["订单2":"订单4"])

4. 选择指定行和列(行标签+列名)

print("n选择 '订单1' 和 '订单3' 的 '商品类别' 和 '订单金额' 列:")
print(df.loc[:, ["商品类别", "订单金额"]])

按位置选择(iloc)

iloc 基于行位置和列位置选择数据(类似 Python 列表切片),语法:df.iloc[行位置, 列位置],位置从 0 开始,切片不包含终点。

1. 选择单个行(按位置)

print("选择第 2 行(位置 1):")
print(df.iloc[1])

2. 选择多个行(位置列表)

print("n选择第 1 行和第 4 行(位置 0 和 3):")
print(df.iloc[[0, 3]])

3. 选择行切片(不包含终点)

print("n选择第 2 行到第 4 行(位置 1 到 3,终点 4 不包含):")
print(df.iloc[1:4])

4. 选择指定行和列(位置组合)

print("n选择第 1、3 行(位置 0、2)的第 2、3 列(位置 1、2):")
print(df.iloc[[0, 2], [1, 2]])

5. 选择所有行,前 2 列

print("n选择所有行的前 2 列:")
print(df.iloc[:, :2])

条件筛选

沿用订单数据

df = pd.DataFrame(

{
    "订单ID": [1001, 1002, 1003, 1004, 1005],
    "商品类别": ["家电", "服饰", "家电", "食品", "服饰"],
    "订单金额": [2999, 599, 1299, 89, 799],
    "支付状态": ["已支付", "已支付", "未支付", "已支付", "已支付"],
}

)

1. 单个条件筛选

筛选订单金额 > 1000 的行

df_high = df[df["订单金额"] > 1000]

筛选商品类别为 "家电" 的行

df_elect = df[df["商品类别"] == "家电"]
print("n商品类别为家电的数据:")
print(df_elect)

2. 多个条件筛选(& 表示且,| 表示或,条件需用 () 包裹)

筛选家电类且金额 > 2000 的行

df_elect_high = df[(df["商品类别"] == "家电") & (df["订单金额"] > 2000)]
print("n家电类且金额 > 2000 的数据:")
print(df_elect_high)

筛选服饰类或未支付的行

df_cloth_unpaid = df[(df["商品类别"] == "服饰") | (df["支付状态"] == "未支付")]
print("n服饰类或未支付的数据:")
print(df_cloth_unpaid)

3. isin() 筛选(属于某个列表中的值)

筛选商品类别为家电或食品的行

df_filter = df[df["商品类别"].isin(["家电", "食品"])]
print("n商品类别为家电或食品的数据:")
print(df_filter)

缺失值处理方法

1. 查看每列缺失值数量

df = pd.DataFrame(

{
    "订单ID": [1001, 1002, 1003, 1004, 1005],
    "商品类别": ["家电", "服饰", "家电", "食品", np.nan],
    "订单金额": [2999, 599, np.nan, 89, 799],
    "支付状态": ["已支付", "已支付", "未支付", np.nan, "已支付"],
}

)

print(df.isna().sum())

2. 查看含缺失值的行

print("n含缺失值的行:")
print(df[df.isna().any(axis=1)])

方法1:删除缺失值(dropna())

1.1 删除含任何缺失值的行(默认 axis=0,how="any")

df_drop_any = df.dropna()
print("删除含任何缺失值的行:")
print(df_drop_any)

仅删除所有列都缺失的行

df_dorp_all = df.dropna(how="all")

按列删除缺失值

df_drop_col = df.dropna(axis=1, thresh=3)

指定列删除

df_drop_set_col = df.dropna(subset=["订单金额"])
print(df_drop_set_col)

方法2:填充缺失值(fillna())

2.1 用固定值填充

df_fill_fixed = df.fillna(1)

2.2 用均值/中位数填充数值型缺失值

df_fill_mean = df.copy()
df_fill_mean["订单金额"] = df_fill_mean["订单金额"].fillna(

df_fill_mean["订单金额"].mean()

)
print(df_fill_mean)

中位数

df_fill_mean["订单金额"] = df_fill_mean["订单金额"].fillna(

df_fill_mean["订单金额"].median()

)
df_fill_ffill = df.copy()

2.3 用前一个值/后一个值填充(ffill/bfill)

df_fill_ffill["支付状态"] = df_fill_ffill[

"支付状态"

].ffill() # ffill:forward fill,前向填
print(df_fill_ffill)

df_fill_ffill["支付状态"] = df_fill_ffill[

"支付状态"

].bfill() # bfill:backward fill,后向填充,前向填
print(df_fill_ffill)

重复值处理

模拟含重复值的数据

df = pd.DataFrame(

{
    "姓名": ["张三", "李四", "张三", "赵六", "李四"],
    "年龄": [22, 25, 22, 24, 25],
    "薪资": [8000, 9500, 8000, 10000, 9500],
    "部门": ["技术", "销售", "技术", "技术", "销售"],
}

)

识别重复行

print(df.duplicated())

2. 查看重复行

print(df[df.duplicated()])

3. 删除重复行(drop_duplicates())

3.1 保留第一行,删除后续重复行(默认)

df_drop_duplicates = df.drop_duplicates()
print(df_drop_duplicates)

3.2 保留最后一行,删除前面重复行

df_drop_dup_last = df.drop_duplicates(keep="last")
print("n删除重复行(保留最后一行):")
print(df_drop_dup_last)

3.3 按指定列判断重复(仅这些列值相同即为重复)

df_drop_dup_col = df.drop_duplicates(subset=["姓名", "部门"], keep="first")
print("n按姓名和部门判断重复并删除:")
print(df_drop_dup_col)
df.drop_duplicates(subset=["姓名"], keep="first")

6.3 数据类型转换

模拟数据类型不规范的数据

df = pd.DataFrame(

{
    "订单ID": [1001, 1002, 1003],
    "订单金额": ["2999", "599", "1299"],  # 字符串类型的数值
    "订单日期": ["2026-01-01", "2026-01-02", "2026-01-03"],  # 字符串类型的日期
    "支付状态": [1, 1, 0],  # 数值类型的布尔值(1=已支付,0=未支付)
}

)

print(df.dtypes)

2. 转换数据类型

2.1 字符串转数值(astype())

df["订单金额"] = df["订单金额"].astype(float)
print(df.dtypes)

2.2 数值转布尔值

df["支付状态"] = df["支付状态"].astype(bool)
print(df.dtypes)

2.3 字符串转日期(to_datetime(),核心方法)

df["订单日期"] = pd.to_datetime(df["订单日期"])
print(df.dtypes)

3. 处理转换失败的情况(errors参数)

df_error = pd.DataFrame({"数值列": ["100", "200", "abc", "300"]})

直接转换会报错,用 errors="coerce" 将无法转换的值设为 np.nan

df_error["数值列"] = pd.to_numeric(df_error["数值列"], errors="coerce")
print("n处理转换失败的数据:")
print(df_error)

数据变换(新增列、apply、map、字符串/日期处理)

模拟数据

df = pd.DataFrame(

{
    "商品名": ["A", "B", "C", "D"],
    "单价": [100, 200, 150, 300],
    "销量": [50, 30, 40, 25],
    "成本": [60, 120, 90, 180],
}

)

1. 基于现有列计算新增列

新增“销售额”列(单价 * 销量)

df["销售额"] = df["单价"] * df["销量"]

新增“利润”列(销售额 - 成本 * 销量)

df["利润"] = df["销售额"] - (df["成本"] * df["销量"])
df["利润率"] = (df["利润"] / df["销售额"]).round(4)
print("新增列后的数据:")
print(df)

2. 条件赋值新增列

新增“销量等级”列:销量>40为“A级”,20-40为“B级”,<20为“C级”

df["销量等级"] = pd.cut(

df["销量"],
bins=[0, 20, 40, 100],  # 区间边界
labels=["C级", "B级", "A级"],  # 区间对应标签
right=True,  # 左闭右开区间(如 [0,20) 为 C级)

)
print("n条件赋值新增列:")
print(df[["商品名", "销量", "销量等级"]])

3. 直接赋值新增列(固定值或列表)

df["品牌"] = "XX品牌" # 固定值
df["批次"] = ["202601", "202601", "202602", "202602"] # 列表(长度需与行数一致)
print("n直接赋值新增列:")
print(df[["商品名", "品牌", "批次"]])

apply 与 map 方法

apply 用于对行/列执行自定义函数,map 用于对 Series 元素执行映射(一对一转换),是灵活处理数据的核心工具。

df = pd.DataFrame(

{
    "商品名": ["A", "B", "C", "D"],
    "类别": ["家电", "服饰", "家电", "食品"],
    "销量": [50, 30, 40, 25],
}

)

1. 字典映射(替换值)

将“类别”列映射为中文全称

category_map = {"家电": "家用电器", "服饰": "服装鞋帽", "食品": "生鲜食品"}
df["类别全称"] = df["类别"].map(category_map)

df["类别全称"] = df["类别"].map(category_map)

2. 函数映射

对“销量”列进行标准化((销量 - 最小值) / (最大值 - 最小值))

def normalize_sales(x):

return (x - df["销量"].min()) / (df["销量"].max() - df["销量"].min())

df["销量标准化"] = df["销量"].map(normalize_sales)

print("map 方法处理后:")

print(df[["商品名", "类别", "类别全称", "销量", "销量标准化"]])

apply 方法(Series/DataFrame 均可)

df = pd.DataFrame(

{"单价": [100, 200, 150, 300], "销量": [50, 30, 40, 25], "成本": [60, 120, 90, 180]}

)

1. 对 Series 用 apply(与 map 类似,更灵活)

df["利润"] = (df["单价"] - df["成本"]) * df["销量"]

用 apply 判断利润等级

def profit_level(profit):

if profit > 2000:
    return "高利润"
elif profit > 1000:
    return "中利润"
else:
    return "低利润"

df["利润等级"] = df["利润"].apply(profit_level)

2. 对 DataFrame 用 apply(按行/列执行函数)

按列执行(默认 axis=0):计算每列的最大值

col_max = df.apply(lambda x: x.max(), axis=0)
print("每列最大值:")
print(col_max)

按行执行(axis=1):计算每行的“单价+成本”总和

df["单价成本和"] = df.apply(lambda x: x["单价"] + x["成本"], axis=1)
print(df)

字符串处理

pandas 为字符串列提供了 str 访问器,支持大小写转换、替换、分割、提取等常用操作,无需循环遍历元素。

模拟含字符串数据

df = pd.DataFrame(

{
    "商品名": ["Apple-手机", "banana-耳机", "Xiaomi-电视", "华为-平板"],
    "备注": [" 新品上架  ", "促销活动!", "限时折扣~~", "库存充足"],
    "规格": ["128G", "无线款", "55英寸", "11英寸"],
}

)

1. 去除空格与特殊字符

df["备注_清理"] = df["备注"].str.strip() # 去除首尾空格
df["备注_无符号"] = df["备注_清理"].str.replace(

r"[!~]", "", regex=True

) # 正则替换特殊字符

2.字符串分割

按 "-" 分割商品名,提取品牌和品类

df[["品牌", "品类"]] = df["商品名"].str.split(

"-", expand=True

) # expand=True 返回 DataFrame

3字符串匹配和提取

判断商品名是否包含字母

df["含字母"] = df["商品名"].str.contains(r"[a-zA-Z]", regex=True)

从规格中提取数字

df["规格数值"] = df["规格"].str.extract(r"(d+)", expand=False) # 提取第一个数字

4. 大小写转换

df["品牌大写"] = df["品牌"].str.upper() # 转大写
df["品类小写"] = df["品类"].str.lower() # 转大写
print("字符串处理后的数据:")
print(df[["商品名", "品牌", "品类", "备注", "备注_无符号", "规格数值"]])

日期时间处理

将日期列转为datetime64 类型后,可通过 dt 访问器提取时间特征、计算时间差,满足时间序列分析需求。

模拟日期数据

df = pd.DataFrame(

{
    "订单ID": [1001, 1002, 1003, 1004],
    "下单时间": [
        "2026-01-01 09:30:00",
        "2026-01-02 14:15:00",
        "2026-01-03 10:00:00",
        "2026-01-05 16:45:00",
    ],
    "发货时间": [
        "2026-01-01 18:00:00",
        "2026-01-03 08:30:00",
        "2026-01-03 16:00:00",
        "2026-01-06 10:10:00",
    ],
}

)

1. 转换为日期时间类型

df["下单时间"] = pd.to_datetime(df["下单时间"])
df["发货时间"] = pd.to_datetime(df["发货时间"])

2.提取时间特征

df["下单日期"] = df["下单时间"].dt.date
df["下单小时"] = df["下单时间"].dt.hour
df["星期几"] = df["下单时间"].dt.day_name()
df["是否周末"] = df["下单时间"].dt.dayofweek.isin([5, 6])

3.计算时间差

df["发货时长(小时)"] = (df["发货时间"] - df["下单时间"]).dt.total_seconds() / 3600

4. 日期偏移与过滤

df["预计送达时间"] = df["发货时间"] + pd.Timedelta(days=2)

筛选1月2日及以后下单的订单

df_jan2 = df[df["下单时间"] >= pd.Timestamp("2026-01-02")]
print(df_jan2)

数据聚合与分组(groupby、pivot_table)

模拟销售数据

df = pd.DataFrame(

{
    "部门": [
        "技术部",
        "销售部",
        "技术部",
        "销售部",
        "技术部",
        "人事部",
        "销售部",
        "人事部",
    ],
    "姓名": ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"],
    "薪资": [8000, 9500, 8800, 10000, 9200, 7500, 11000, 7800],
    "绩效": [85, 92, 88, 95, 90, 82, 98, 86],
}

)

1. 按单列分组,计算单个指标

按“部门”分组,计算薪资均值

salary_mean = df.groupby("部门")["薪资"].mean()
print(salary_mean)

2. 按单列分组,计算多个指标

按“部门”分组,计算薪资的均值、最大值、最小值

dept_salary_stats = df.groupby("部门")["薪资"].agg(["mean", "max", "min"])
dept_salary_stats.columns = ["薪资均值", "薪资最高", "薪资最低"] # 重命名列
print(dept_salary_stats)

3. 按单列分组,对多列计算不同指标

dept_multi_stats = df.groupby("部门").agg({"薪资": "mean", "绩效": "sum"})

4. 按多列分组

按“部门”和“性别”分组(新增性别列)

df["性别"] = ["男", "男", "女", "男", "女", "女", "男", "女"]
dept_gender_stats = df.groupby(["部门", "性别"])["薪资"].mean()
print(dept_gender_stats)

重置索引(将分组标签转为列)

dept_gender_stats_reset = dept_gender_stats.reset_index()
print("n重置索引后:")
print(dept_gender_stats_reset)

高级用法(自定义聚合函数)

df = pd.DataFrame(

{
    "部门": ["技术部", "销售部", "技术部", "销售部", "技术部"],
    "薪资": [8000, 9500, 8800, 10000, 9200],
    "绩效": [85, 92, 88, 95, 90],
}

)

def salary_perf_product_mean(group):

product = group["薪资"] * group["绩效"]
return product.mean()

按部门分组应用自定义函数

dept_custom_stats = df.groupby("部门").apply(salary_perf_product_mean)

结合 agg 应用多个自定义函数

def range_calc(series):

return series.max() - series.min()  # 计算极差

dept_multi_custom = df.groupby("部门")["薪资"].agg([range_calc, "mean"])
dept_multi_custom.columns = ["薪资极差", "薪资均值"]

pivot_table 透视表

沿用销售数据,新增“入职年份”列

df = pd.DataFrame(

{
    "部门": [
        "技术部",
        "销售部",
        "技术部",
        "销售部",
        "技术部",
        "人事部",
        "销售部",
        "人事部",
    ],
    "性别": ["男", "男", "女", "男", "女", "女", "男", "女"],
    "入职年份": [2023, 2022, 2023, 2021, 2022, 2023, 2022, 2021],
    "薪资": [8000, 9500, 8800, 10000, 9200, 7500, 11000, 7800],
    "绩效": [85, 92, 88, 95, 90, 82, 98, 86],
}

)

1. 基础透视表:行=部门,列=性别,值=薪资,聚合函数=均值

pivot1 = pd.pivot_table(

df,
index="部门",  # 行维度
columns="性别",  # 列维度
values="薪资",  # 聚合值
aggfunc="mean",  # 聚合函数

)

print(pivot1)

数据合并与连接

实际数据分析中,数据常分散在多个表格中,需通过合并/连接操作整合为一张完整表格,pandas 提供 merge(按列连接)、concat(拼接)、join(按索引连接)三种核心方法

merge 按列连接(类似 SQL 连接)

merge 基于一个或多个共同列(键)连接两个 DataFrame,支持内连接、左连接、右连接、外连接四种类型,与 SQL 连接逻辑一致。

准备两个表格数据

员工基本信息表

df_emp = pd.DataFrame(

{
    "员工ID": [101, 102, 103, 104],
    "姓名": ["张三", "李四", "王五", "赵六"],
    "部门ID": [1, 2, 1, 3],
}

)

部门信息表

df_dept = pd.DataFrame(

{
    "部门ID": [1, 2, 3, 4],
    "部门名称": ["技术部", "销售部", "人事部", "财务部"],
    "部门经理": ["孙七", "周八", "吴九", "郑十"],
}

)

1. 内连接(默认 how="inner"):只保留两个表中键值匹配的行

merge_inner = pd.merge(df_emp, df_dept, on="部门ID")
print("内连接结果:")
print(merge_inner)

2. 左连接(how="left"):保留左表所有行,右表匹配不到的填充 NaN

merge_left = pd.merge(df_emp, df_dept, on="部门ID", how="left")
print("n左连接结果:")
print(merge_left)

4. 外连接(how="outer"):保留两个表所有行,匹配不到的填充 NaN

merge_outer = pd.merge(df_emp, df_dept, on="部门ID", how="outer")
print("n外连接结果:")
print(merge_outer)

5. 按多列连接(键为多个列)

df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4], "C": [5, 6]})
df2 = pd.DataFrame({"A": [1, 2], "B": [3, 5], "D": [7, 8]})
merge_multi_key = pd.merge(df1, df2, on=["A", "B"], how="inner")
print("n按多列内连接结果:")
print(merge_multi_key)

concat 拼接(上下/左右)

concat 用于沿指定轴拼接多个 DataFrame,无需共同键,支持上下拼接(axis=0,默认)和左右拼接(axis=1)。

准备拼接数据

df_a = pd.DataFrame(

{"员工ID": [101, 102], "姓名": ["张三", "李四"], "薪资": [8000, 9500]}

)

df_b = pd.DataFrame(

{"员工ID": [103, 104], "姓名": ["王五", "赵六"], "薪资": [8800, 10000]}

)

df_c = pd.DataFrame(

{"绩效": [85, 92, 88, 95], "入职年份": [2023, 2022, 2023, 2021]}, index=[0, 1, 2, 3]

)

1. 上下拼接(axis=0):合并行,列需一致或部分一致

concat_rows = pd.concat([df_a, df_b], ignore_index=True) # ignore_index=True 重置行索引
print("上下拼接结果:")
print(concat_rows)

2. 左右拼接(axis=1):合并列,按索引匹配行

concat_cols = pd.concat([concat_rows, df_c], axis=1)
print("n左右拼接结果:")
print(concat_cols)

3. 拼接时去重(join="inner"):只保留索引/列匹配的部分

df_d = pd.DataFrame({"绩效": [85, 92]}, index=[0, 1])
concat_inner = pd.concat([df_a, df_d], axis=1, join="inner")
print("n内连接左右拼接结果:")
print(concat_inner)

4. 给拼接的数据添加来源标识

df_a["来源"] = "旧员工"
df_b["来源"] = "新员工"
concat_flag = pd.concat([df_a, df_b], ignore_index=True)
print("n带来源标识的拼接结果:")
print(concat_flag)

添加新评论