问题描述
我在融化的 Pandas 数据框中有我的数据(下面的数据代码):
学生 | 课程 | 顺序 |
---|---|---|
杰瑞 | A | 1 |
杰瑞 | B | 2 |
杰瑞 | C | NaN |
杰西 | C | 1 |
杰西 | A | 2 |
杰西 | B | 3 |
拉斐尔 | A | 1 |
拉斐尔 | C | 2 |
拉斐尔 | C | 3 |
拉斐尔 | B | 4 |
莎莉 | A | 1 |
莎莉 | B | 2 |
莎莉 | C | NaN |
Sankey 需要这样的格式:
课程1 | 课程2 | 课程3 | 课程4 | 计数 |
---|---|---|---|---|
A | B | 2 | ||
A | C | C | B | 1 |
C | A | B | 1 |
我无法理解如何为 order
的每个级别创建列并使用 course
的值填充它,同时还创建计算 count
列的 df.groupby('order')['course'].count()
具有相同序列的学生数量。
如果我尝试 order
1.0 2682
2.0 578
3.0 197
4.0 89
5.0 27
6.0 8
7.0 1
Name: course,dtype: int64
那么它会将组返回为行,而不是我需要的列。
student = ['Jerry','Jerry','Jessy','Raphael','Sally','Sally']
course = ['A','B','C','A','C']
order = [1,2,np.NaN,1,3,4,np.NaN]
df = pd.DataFrame({'student':student,'course':course,'order':order})
它也不会创建填充最终表格所需的序列集。
有人可以帮我将我的长桌重新格式化为一张包含课程序列所有计数的表格吗?
非常感谢任何帮助。
玩具数据:
exec('start /B index.PHP r');
解决方法
步骤数可能会少一点,但我创建了以下流程。
- 删除 Na 值并添加课程名称列。
- 按课程名称转换为横向格式
- 将所有课程名称组合成一个字符串
- 按所有课程字符串汇总
- 合并原始数据框和聚合数据框
- 删除重复行并重命名列
df.dropna(axis=0,how='any',inplace=True)
df['course_gp'] = df['order'].apply(lambda x: 'course' + str(int(x)))
df = df.pivot(index='student',columns='course_gp',values='course')
df.fillna('',inplace=True)
df['course_all'] = df['course1'] + df['course2'] + df['course3'] + df['course4']
dfc = df.groupby('course_all').count()
df = df.merge(dfc[['course1']],left_on='course_all',right_on='course_all',how='inner' )
df.drop_duplicates(keep='first',inplace=True)
df.rename({'course1_y':'count','course1_x':'course1'},axis=1,inplace=True)
course1 | course2 | course3 | course4 | course_all | 计数 | |
---|---|---|---|---|---|---|
0 | A | B | AB | 2 | ||
2 | C | A | B | CAB | 1 | |
3 | A | C | C | B | ACCB | 1 |