按照具有多个值的一列对DF进行排序

3
在我的主要数据框中,我有一列与其他两列组合起来,创建出像这样的值:A1_43567_1。第一个数字表示所采取的评估类型,第二个数字是问题ID,最后一个数字是评估题目的位置。我计划创建一个数据透视表,以使每个唯一的值作为列,查看多个学生在每个项目上的选择。但是我希望数据透视表的顺序是根据问题位置或拼接中的第三个值。基本上输出如下:
    Student ID  A1_45678_1  A1_34551_2  A1_11134_3  etc....
    12345           1            0          0      
    12346           0            0          1
    12343           1            1          0

我已经尝试按照我想要排序的原始列(问题位置)对数据框进行排序,然后创建数据透视表,但这并没有呈现出我正在寻找的上述结果。是否有一种方法可以按列中第三个值对原始连接值进行排序?或者是否可以按每列的第三个值对数据透视表进行排序?
目前的代码是:
   demo_pivot.sort(['Question Position'], ascending=True)

   demo_pivot['newcol'] = 'A' + str(interim_selection) + '_' + ,\
   demo_pivot['Item ID'].map(str) + "_" + demo_pivot['Question Position'].map(str)

   demo_pivot= pd.pivot_table(demo_pivot, index='Student ANET ID',values='Points Received',\
   columns='newcol').reset_index()

但是输出的结果是这样的:
    Student ID  A1_45678_1  A1_34871_7  A1_11134_15  etc....
    12345           1            0          0      
    12346           0            0          1
    12343           1            1          0
1个回答

2
调用 pd.pivot_table() 方法会返回一个 DataFrame,对吗?如果是这样的话,你能否重新排列生成的 DataFrame 的列呢?类似这样:
def sort_columns(column_list):
    # Create a list of tuples: (question position, column name)
    sort_list = [(int(col.split('_')[2]), col) for col in column_list]

    # Sorts by the first item in each tuple, which is the question position
    sort_list.sort() 

    # Return the column names in the sorted order:
    return [x[1] for x in sort_list]

# Now, you should be able to reorder the DataFrame like so:
demo_pivot = demo_pivot.loc[:, sort_columns(demo_pivot.columns)] 

2
你可以使用demo_pivot = demo_pivot[sort_columns(demo_pivot.columns)]代替最后的.loc - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接