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

将 DataFrame 中某一列的列表拆分成多个独立的列的方式

要将 DataFrame 中某一列的列表拆分成多个独立的列,可以使用以下方法,具体取决于数据结构和需求:


场景示例

假设 DataFrame 中 genres 列存储的是列表(如 ['drama', 'action']),目标是将每个列表元素拆分成多列:

import pandas as pd

# 示例数据
data = {
    'ID': [1, 2, 3],
    'genres': [
        ['drama', 'action'],
        ['comedy'],
        ['thriller', 'horror', 'mystery']
    ]
}
df = pd.DataFrame(data)

方法 1:横向拆分列表为多列

将列表元素按位置拆分成 genre_1, genre_2, ... 的列,适合固定长度的列表或保留元素顺序。

步骤
  1. 将列表列转换为多列

    genres_expanded = df['genres'].apply(pd.Series)
    
  2. 重命名新列(可选):

    genres_expanded.columns = [f'genre_{i+1}' for i in genres_expanded.columns]
    
  3. 合并回原 DataFrame

    df = pd.concat([df, genres_expanded], axis=1)
    
输出结果
   ID                     genres genre_1 genre_2   genre_3
0   1           [drama, action]   drama  action       NaN
1   2                  [comedy]  comedy     NaN       NaN
2   3  [thriller, horror, mystery] thriller  horror  mystery

方法 2:独热编码(One-Hot Encoding)

将列表元素转换为布尔列(每个元素为一列,存在则为 1,否则为 0),适合分类统计。

步骤
  1. 使用 MultiLabelBinarizer(需安装 scikit-learn):

    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    genres_encoded = pd.DataFrame(
        mlb.fit_transform(df['genres']),
        columns=mlb.classes_,
        index=df.index
    )
    
  2. 合并回原 DataFrame

    df = pd.concat([df, genres_encoded], axis=1)
    
输出结果
   ID                     genres  action  comedy  drama  horror  mystery  thriller
0   1           [drama, action]       1       0      1       0        0         0
1   2                  [comedy]       0       1      0       0        0         0
2   3  [thriller, horror, mystery] 0       0      0       1        1         1

方法 3:纵向展开为多行

将列表元素拆分成多行(每行一个元素),适合后续聚合或统计每个元素出现的次数。

步骤
df_exploded = df.explode('genres')
输出结果
   ID    genres
0   1     drama
0   1    action
1   2    comedy
2   3  thriller
2   3    horror
2   3  mystery

选择建议

需求推荐方法工具
保留元素顺序和位置横向拆分(方法1)pd.Series + pd.concat
统计元素存在性(分类分析)独热编码(方法2)MultiLabelBinarizer
展开元素为独立行纵向展开(方法3)df.explode()

处理原始数据为列表

如果原数据是字符串(如 "drama,action"),需先转换为列表:

# 将字符串按分隔符拆分成列表
df['genres'] = df['genres'].str.split(',')

代码整合

import pandas as pd

# 示例数据(假设 genres 是字符串)
data = {
    'ID': [1, 2, 3],
    'genres': ['drama,action', 'comedy', 'thriller,horror,mystery']
}
df = pd.DataFrame(data)

# Step 1: 转换为列表
df['genres'] = df['genres'].str.split(',')

# Step 2: 横向拆分为多列
genres_expanded = df['genres'].apply(pd.Series).add_prefix('genre_')
df_split = pd.concat([df, genres_expanded], axis=1)

print("=== 横向拆分结果 ===")
print(df_split)

# Step 3: 独热编码
from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
genres_encoded = pd.DataFrame(mlb.fit_transform(df['genres']), columns=mlb.classes_, index=df.index)
df_encoded = pd.concat([df, genres_encoded], axis=1)

print("\n=== 独热编码结果 ===")
print(df_encoded)

# Step 4: 纵向展开
df_exploded = df.explode('genres')
print("\n=== 纵向展开结果 ===")
print(df_exploded)

输出示例

=== 横向拆分结果 ===
   ID               genres genre_0 genre_1   genre_2
0   1       [drama, action]   drama  action       NaN
1   2              [comedy]  comedy     NaN       NaN
2   3  [thriller, horror, mystery] thriller   horror  mystery

=== 独热编码结果 ===
   ID               genres  action  comedy  drama  horror  mystery  thriller
0   1       [drama, action]       1       0      1       0        0         0
1   2              [comedy]       0       1      0       0        0         0
2   3  [thriller, horror, mystery]       0       0      0       1        1         1

=== 纵向展开结果 ===
   ID    genres
0   1     drama
0   1    action
1   2    comedy
2   3  thriller
2   3    horror
2   3  mystery

根据分析目标选择最合适的方法即可!

http://www.dtcms.com/a/113307.html

相关文章:

  • Linux上位机开发实践(做一专多能的方案提供者)
  • 从情感分析到朴素贝叶斯法:基于朴素贝叶斯的情感分析如何让DeepSeek赋能你的工作?
  • 【Kubernetes】RBAC(基于角色的访问控制)如何设置?如何管理 Kubernetes 的权限?
  • MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务
  • HTTP/2:新一代网络协议的变革与优势
  • 借 DCMM 东风,提升数据管理价值生产力
  • BugKu Simple_SSTI_2
  • 【UE5 C++课程系列笔记】31——创建Json并保存为文件
  • 横扫SQL面试——TopN问题
  • 团体设计程序天梯赛L2-025 # 分而治之
  • Maven使用
  • 3535 数组分割
  • Python 数据库选型指南(架构师视角)
  • BUUCTF-web刷题篇(12)
  • 智能体和RPA都需要程序思维,如何使用影刀的变量?
  • HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context
  • Python解决“数字插入”问题
  • 英语听力4.5
  • 6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)
  • Python作业3 字符田字格绘制
  • C语言之标准库中的常用api
  • 必刷算法100题之计算右侧小于当前元素的个数
  • 【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)
  • Linux数据库:【数据库基础】【库的操作】【表的操作】
  • [SAP SD] 常用事务码
  • Linux的/proc/sys/net/ipv6/conf/(all,default,interfaceName具体网络接口名称)/ 笔记250405
  • 国产系统统信uos和麒麟v10在线打开word给表格赋值
  • HTTP查询参数示例(XMLHttpRequest查询参数)(带查询参数的HTTP接口示例——以python flask接口为例)flask查询接口
  • ConstructorResolver
  • Day2-2:前端项目uniapp壁纸实战