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
说明
- 先
stack课程列可以完整保留所有非NaN的课程记录,避免后续操作丢失数据 - 按Session分组处理参会人数,确保每个课程都能匹配到正确的人数:
- 对于有多个参会人数的Session(如session1),直接按顺序分配给对应课程
- 对于单个参会人数对应多个课程的Session(如session3),将参会人数重复分配给每个课程
内容的提问来源于stack exchange,提问作者hyeri
相关产品推荐
相关产品推荐

