You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中DataFrame格式转换:合并技术需求列

问题分析与优化方案

你的需求是将DataFrame中多个标记为1的技术列(big_data、spark、hadoop等)合并为单个technologies_required列,同时保留其他业务列。下面针对你的现有代码分析问题,并给出更优实践方案:

现有代码的不足

  1. 排除列列表错误:代码里的['job_posting', 'for_example_rating']和实际数据不匹配,实际需要排除的是job_posting、Job_description、rating、company_name、Founded、Location这些非技术列,否则会误将其他含1的列混入结果。
  2. 效率问题:apply(lambda x: ..., axis=1)是逐行遍历DataFrame,当数据量较大(上万行及以上)时,速度远慢于Pandas的向量化操作。

更优实践方案

方案1:明确指定技术列(推荐,可读性强)

手动列出所有技术列,精准筛选目标列进行合并,避免误操作:

import pandas as pd

# 构造原始DataFrame
data = {
    'job_posting': [1,2,3],
    'Job_description': ['blalbblablabla']*3,
    'rating': [3,4,0],
    'company_name': ['Exson', '1', 'Wine20'],
    'big_data': [1,0,1],
    'spark': [0,0,1],
    'hadoop': [1,0,0],
    'power bi': [0,1,0],
    'excel': [0,1,0],
    'python': [0,0,1],
    'azure': [0,0,1],
    'Founded': [2007,2010,2000],
    'Location': ['US','EU','LA']
}
df = pd.DataFrame(data)

# 定义技术列列表
tech_columns = ['big_data', 'spark', 'hadoop', 'power bi', 'excel', 'python', 'azure']

# 生成合并后的技术列
df['technologies_required'] = df[tech_columns].apply(lambda x: ', '.join(x.index[x == 1]), axis=1)

# 整理目标列顺序
new_df = df[['job_posting', 'Job_description', 'rating', 'company_name', 'technologies_required', 'Founded', 'Location']]

print(new_df)

方案2:自动筛选技术列(适合列名有规律的场景)

如果技术列的位置固定(比如在company_name之后、Founded之前),可以通过列索引范围自动筛选:

# 获取技术列的索引区间
start_idx = df.columns.get_loc('company_name') + 1
end_idx = df.columns.get_loc('Founded')
tech_columns = df.columns[start_idx:end_idx]

# 后续合并、列整理操作和方案1一致
df['technologies_required'] = df[tech_columns].apply(lambda x: ', '.join(x.index[x == 1]), axis=1)
new_df = df[['job_posting', 'Job_description', 'rating', 'company_name', 'technologies_required', 'Founded', 'Location']]

方案3:向量化操作(极致效率)

针对超大数据量场景,用向量化操作替代逐行遍历,大幅提升速度:

tech_columns = ['big_data', 'spark', 'hadoop', 'power bi', 'excel', 'python', 'azure']

# 生成布尔矩阵,通过矩阵乘法快速拼接列名
tech_mask = df[tech_columns] == 1
df['technologies_required'] = tech_mask.dot(pd.Series(tech_columns, index=tech_columns) + ', ').str.rstrip(', ')

# 整理目标列
new_df = df[['job_posting', 'Job_description', 'rating', 'company_name', 'technologies_required', 'Founded', 'Location']]

总结

你的核心思路是正确的,但需要修正排除列的错误,并根据数据量选择合适的实现方式:

  • 小数据量:用方案1或2即可,代码清晰易维护
  • 大数据量:优先用方案3的向量化操作,效率提升显著

内容的提问来源于stack exchange,提问作者Susy84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:38:32