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

Pandas中同时运用stack与explode处理列的技术问题

问题:DataFrame同时实现explode与stack并正确匹配参会人数

原始数据

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']})

当前操作的问题

现有操作先拆分并explodeAttendees列,再执行stack,结果丢失了session3的Course 2记录,无法得到完整的匹配结果:

  • 当前错误结果:
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
  • 期望结果:
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,再根据每个Session的课程数量匹配参会人数:

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']})

# 第一步:将课程列stack,保留Session和Attendees,过滤NaN的课程
course_stack = df.set_index(['Session', 'Attendees']).stack().reset_index().rename(columns={0:'Courses', 'level_2':'level_1'})

# 第二步:拆分Attendees为列表,并根据每个Session的课程数量分配对应人数
def assign_attendees(group):
    attendees_list = group['Attendees'].iloc[0].split(' & ')
    # 如果参会人数列表长度和课程数一致,直接分配;否则重复参会人数(如session3)
    if len(attendees_list) == len(group):
        group['Attendees'] = attendees_list
    else:
        group['Attendees'] = attendees_list * len(group)
    return group

# 按Session分组处理
result = course_stack.groupby('Session').apply(assign_attendees).reset_index(drop=True)

print(result)

执行后得到的结果与期望一致:

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

说明

  1. 先stack课程列可以完整保留所有非NaN的课程记录,避免后续操作丢失数据
  2. 按Session分组处理参会人数,确保每个课程都能匹配到正确的人数:
    • 对于有多个参会人数的Session(如session1),直接按顺序分配给对应课程
    • 对于单个参会人数对应多个课程的Session(如session3),将参会人数重复分配给每个课程

内容的提问来源于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 23:27:31