Python中DataFrame格式转换:合并技术需求列
问题分析与优化方案
你的需求是将DataFrame中多个标记为1的技术列(big_data、spark、hadoop等)合并为单个technologies_required列,同时保留其他业务列。下面针对你的现有代码分析问题,并给出更优实践方案:
现有代码的不足
- 排除列列表错误:代码里的
['job_posting', 'for_example_rating']和实际数据不匹配,实际需要排除的是job_posting、Job_description、rating、company_name、Founded、Location这些非技术列,否则会误将其他含1的列混入结果。 - 效率问题:
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
相关产品推荐
相关产品推荐

