Pandas 将字典按列排序为

Pandas 将字典按列排序为,pandas,pandas-groupby,Pandas,Pandas Groupby,我有一个如下所示的数据帧 user_id Recommended_modules Remaining_modules 1 {A:[5,11], B:[4]} {A:2, B:1} 2 {A:[8,4,2], B:[5], C:[6,8]} {A:7, B:1, C:2} 3 {A:[2,3,9], B:[8]}

我有一个如下所示的数据帧

user_id     Recommended_modules                     Remaining_modules
1           {A:[5,11], B:[4]}                       {A:2, B:1}
2           {A:[8,4,2], B:[5], C:[6,8]}             {A:7, B:1, C:2}
3           {A:[2,3,9], B:[8]}                      {A:5, B:1}
4           {A:[8,4,2], B:[5,1,2], C:[6]}           {A:3, B:4, C:1} 
数据帧简介:

在“推荐”列中,模块A、B和C是课程,列表中的数字是模块

关键(剩余的_模块)=课程名称

值(剩余模块)=该课程中剩余模块的数量

根据上面的内容,我想根据剩余的_模块中的值对推荐的_模块列重新排序,如下所示

user_id     Recommended_modules                     Remaining_modules
1           {A:[5,11], B:[4]}                       {A:2, B:1}
2           {A:[8,4,2], B:[5], C:[6,8]}             {A:7, B:1, C:2}
3           {A:[2,3,9], B:[8]}                      {A:5, B:1}
4           {A:[8,4,2], B:[5,1,2], C:[6]}           {A:3, B:4, C:1} 
预期产出:

user_id     Ordered_Recommended_modules             Ordered_Remaining_modules
1           {B:[4], A:[5,11]}                       {B:1, A:2}
2           {B:[5], C:[6,8], A:[8,4,2]}             {B:1, C:2, A:7}
3           {B:[8], A:[2,3,9]}                      {B:1, A:5}
4           {C:[6], A:[8,4,2], B:[5,1,2]}           {C:1, A:3, B:4} 
说明:

对于用户_id=2,剩余的_模块={A:7,B:1,C:2},排序如下{B:1,C:2,A:7}

同样,也按照如下所示的相同顺序排列推荐的_模块
{B:[5],C:[6,8],A:[8,4,2]}。

有可能,只需要python 3.6+:

def f(x):
    #https://stackoverflow.com/a/613218/2901002
    d1 = {k: v for k, v in sorted(x['Remaining_modules'].items(), key=lambda item: item[1])}
    L = d1.keys()
    #https://stackoverflow.com/a/21773891/2901002
    d2 = {key:x['Recommended_modules'][key] for key in L if key in x['Recommended_modules']}
    x['Remaining_modules'] = d1
    x['Recommended_modules'] = d2
    return x

df = df.apply(f, axis=1)
print (df)
   user_id                         Recommended_modules  \
0        1                    {'B': [4], 'A': [5, 11]}   
1        2     {'B': [5], 'C': [6, 8], 'A': [8, 4, 2]}   
2        3                  {'B': [8], 'A': [2, 3, 9]}   
3        4  {'C': [6], 'A': [8, 4, 2], 'B': [5, 1, 2]}   

          Remaining_modules  
0          {'B': 1, 'A': 2}  
1  {'B': 1, 'C': 2, 'A': 7}  
2          {'B': 1, 'A': 5}  
3  {'C': 1, 'A': 3, 'B': 4}  

这是可能的,只需要python 3.6+:

def f(x):
    #https://stackoverflow.com/a/613218/2901002
    d1 = {k: v for k, v in sorted(x['Remaining_modules'].items(), key=lambda item: item[1])}
    L = d1.keys()
    #https://stackoverflow.com/a/21773891/2901002
    d2 = {key:x['Recommended_modules'][key] for key in L if key in x['Recommended_modules']}
    x['Remaining_modules'] = d1
    x['Recommended_modules'] = d2
    return x

df = df.apply(f, axis=1)
print (df)
   user_id                         Recommended_modules  \
0        1                    {'B': [4], 'A': [5, 11]}   
1        2     {'B': [5], 'C': [6, 8], 'A': [8, 4, 2]}   
2        3                  {'B': [8], 'A': [2, 3, 9]}   
3        4  {'C': [6], 'A': [8, 4, 2], 'B': [5, 1, 2]}   

          Remaining_modules  
0          {'B': 1, 'A': 2}  
1  {'B': 1, 'C': 2, 'A': 7}  
2          {'B': 1, 'A': 5}  
3  {'C': 1, 'A': 3, 'B': 4}  

python
dict
是无序的集合。。。但我是来工作的-arounds@ChrisA-在python 3.6下,只有python
dict
是无序集合。。。但我是来工作的-arounds@ChrisA-仅在python 3.6下