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

Pandas拆分多值列并堆叠列时的课程数据缺失问题

问题解决:Pandas中堆叠与拆分列时的课程数据缺失问题

问题背景

现有处理逻辑能正常处理参会人数用&分隔的场景,但当单日多场会议参会人数相同(无&分隔)时,会遗漏存在有效值的非对应索引课程数据,比如示例中session3的Course 2数据。

示例数据集

import pandas as pd
import numpy as np
df = pd.DataFrame({'Session':['session1', 'session2','session3'],
                    'Course 1':['intro to','advanced','Cv'],
                    'Course 2':['Computer skill',np.nan,'Write cover letter'],
                    'Attendees':['24 & 46','23','30']})

原有代码问题分析

原有逻辑通过遍历Attendees拆分后的列表元素,仅保留对应索引的Course(如第0个参会人数对应Course 1,第1个对应Course 2),其余Course设为NaN。但当Attendees只有一个值时,循环仅执行一次,直接忽略了其他存在有效值的Course(比如session3的Course 2)。

修正方案

核心思路:先识别每个Session下非NaN的有效Course列,再根据参会人数列表的长度,将参会人数与有效Course做对应分配:

  • 若参会人数列表长度等于有效Course数量:一一对应分配
  • 若参会人数只有一个值:将该值分配给所有有效Course

修正后的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Session':['session1', 'session2','session3'],
                    'Course 1':['intro to','advanced','Cv'],
                    'Course 2':['Computer skill',np.nan,'Write cover letter'],
                    'Attendees':['24 & 46','23','30']})

# 拆分参会人数为列表
df['Attendees'] = df['Attendees'].str.split(' & ')

# 初始化空结果集
result = []

for _, row in df.iterrows():
    session = row['Session']
    attendees = row['Attendees']
    # 筛选当前行非NaN的Course列(提取列名和对应值)
    valid_courses = [(col, val) for col, val in row.items() 
                     if col.startswith('Course ') and pd.notna(val)]
    course_count = len(valid_courses)
    
    # 处理参会人数与Course的对应关系
    if len(attendees) == course_count:
        # 一一对应分配
        for (course_col, course_val), attendee in zip(valid_courses, attendees):
            result.append({
                'Session': session,
                'level_1': course_col,
                'Courses': course_val,
                'Attendees': attendee
            })
    else:
        # 参会人数只有一个,分配给所有有效Course
        attendee = attendees[0]
        for course_col, course_val in valid_courses:
            result.append({
                'Session': session,
                'level_1': course_col,
                'Courses': course_val,
                'Attendees': attendee
            })

# 转换为DataFrame
final_df = pd.DataFrame(result)
print(final_df)

输出结果

Session    level_1             Courses Attendees
0  session1  Course 1            intro to        24
1  session1  Course 2      Computer skill        46
2  session2  Course 1            advanced        23
3  session3  Course 1                  Cv        30
4  session3  Course 2  Write cover letter        30

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:17:30