首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据自定义列表对数据帧中的列进行排序

根据自定义列表对数据帧中的列进行排序
EN

Stack Overflow用户
提问于 2019-03-21 14:28:07
回答 4查看 73关注 0票数 4

我可以看到垂直排序记录的解决方案,但是我希望水平地排列数据中的一个子集。

下面是我想对数据进行排序的数据:

代码语言:javascript
复制
account_num Word_0    Word_1    Word_2    Word_3    Word_4
123         Silver    Platinum  Osmium    
456         Platinum  
789         Silver    Rhodium   Platinum  Osmium    

这是我想要的输出:

代码语言:javascript
复制
account_num  Word_0     Word_1    Word_2   Word_3   Word_4
123          Platinum   Osmium    Silver   
456          Platinum   
789          Rhodium    Platinum  Osmium   Silver   

根据此数据框架内的顺序:

代码语言:javascript
复制
Priority    Metal
1           Rhodium
2           Platinum
3           Gold
4           Ruthenium
5           Iridium
6           Osmium
7           Palladium
8           Rhenium
9           Silver
10          Indium

我已经用这段代码整理了我的数据:

代码语言:javascript
复制
newdf.apply(lambda r: sorted(r,reverse = True), axis = 1)

其中,列Word_0到4被放置在另一个dataframe (newdf)中,然后按反向顺序排序,因此空白值出现在最后,然后将它们重新连接到包含account_num列的原始数据have中,但是我不知道如何将自定义列表合并到排序序列中。

任何帮助都将不胜感激。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-21 14:45:35

使用pd.Categorical

代码语言:javascript
复制
c = pd.Categorical(df2.Metal, df2.Metal, ordered=True)

df.set_index('account_num').transform(lambda k: pd.Categorical(k, 
                                                           categories=c.categories)\
                                  .sort_values(), axis=1)

输出

代码语言:javascript
复制
            Word_0       Word_1     Word_2  Word_3  Word_4
account_num                 
123         Platinum     Osmium     Silver  NaN     NaN
456         Platinum     NaN        NaN     NaN     NaN
789         Rhodium      Platinum   Osmium  Silver  NaN

当然,最终总是可以.fillna('')

票数 3
EN

Stack Overflow用户

发布于 2019-03-21 14:37:43

我觉得我们可以melt它,merge命令df,然后基于Prioritysort_values,以及pivot返回。

代码语言:javascript
复制
s=df.melt('account_num').\
     merge(orderdf,left_on='value',right_on='Metal',how='left').\
       sort_values('Priority')
yourdf=s.assign(newkey=s.groupby('account_num').cumcount()).\
           pivot('account_num','newkey','value').add_prefix('Word_')
yourdf
Out[1100]: 
newkey         Word_0    Word_1  Word_2  Word_3 Word_4
account_num                                           
123          Platinum    Osmium  Silver    None    NaN
456          Platinum      None    None    None    NaN
789           Rhodium  Platinum  Osmium  Silver    NaN

或者我们在argsort中使用更清晰的逻辑

代码语言:javascript
复制
d = dict(zip(df2['Metal'], df2['Priority']))
for x in range(len(df)):

    df.iloc[x,:]=df.values[x,np.argsort([d.get(x) if x ==x else 1000 for x in df.values[x,:]] )]

df
Out[38]: 
                 Word_0    Word_1  Word_2  Word_3  Word_4
  account_num                                            
0 123          Platinum    Osmium  Silver     NaN     NaN
1 456          Platinum       NaN     NaN     NaN     NaN
2 789           Rhodium  Platinum  Osmium  Silver     NaN
票数 3
EN

Stack Overflow用户

发布于 2019-03-21 14:52:59

你也可以尝试:

代码语言:javascript
复制
df=df.fillna(value=pd.np.nan)
d=dict(zip(ref.Metal,ref.Priority))
df[['account_num']].join(pd.DataFrame(np.sort(df.iloc[:,1:].replace(d).values,axis=1),
                        columns=df.iloc[:,1:].columns).replace({v:k for k,v in d.items()}))

   account_num    Word_0    Word_1  Word_2  Word_3 Word_4
0          123  Platinum    Osmium  Silver     NaN    NaN
1          456  Platinum       NaN     NaN     NaN    NaN
2          789   Rhodium  Platinum  Osmium  Silver    NaN
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55282717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档