重新格式化 Pandas 中 Sankey 的数据集

问题描述

我在融化的 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');

解决方法

步骤数可能会少一点,但我创建了以下流程。

  1. 删除 Na 值并添加课程名称列。
  2. 按课程名称转换为横向格式
  3. 将所有课程名称组合成一个字符串
  4. 按所有课程字符串汇总
  5. 合并原始数据框和聚合数据框
  6. 删除重复行并重命名列
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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...