【问题标题】:Pandas get sorted index order for multiple columnsPandas 获得多列的排序索引顺序
【发布时间】:2016-12-12 00:53:11
【问题描述】:

我有类似以下多索引 Pandas 系列的内容,其中值按团队、年份和性别进行索引。

>>> import pandas as pd
>>> import numpy as np
>>> multi_index=pd.MultiIndex.from_product([['Team A','Team B', 'Team C', 'Team D'],[2015,2016],['Male','Female']], names = ['Team','Year','Gender'])
>>> np.random.seed(0)
>>> df=pd.Series(index=multi_index, data=np.random.randint(1, 10, 16))
>>> df
>>> 
Team    Year  Gender
Team A  2015  Male      6
              Female    1
        2016  Male      4
              Female    4
Team B  2015  Male      8
              Female    4
        2016  Male      6
              Female    3
Team C  2015  Male      5
              Female    8
        2016  Male      7
              Female    9
Team D  2015  Male      9
              Female    2
        2016  Male      7
              Female    8

我的目标是获取每个 4 年/性别组合(2015 年男性、2016 年男性、2015 年女性和 2016 年女性)的团队排名顺序的数据框。

我的方法是首先解开数据框,以便团队对其进行索引...

>>> unstacked_df = df.unstack(['Year','Gender'])
>>> print unstacked_df
>>> 
>>> 
Year   2015        2016       
Gender Male Female Male Female
Team                          
Team A    6      1    4      4
Team B    8      4    6      3
Team C    5      8    7      9
Team D    9      2    7      8

然后通过对这 4 列中的每一列进行循环和排序,根据索引顺序创建一个数据框...

>>> team_orders = np.array([unstacked_df.sort_values(x).index.tolist() for x in unstacked_df.columns]).T
>>> result = pd.DataFrame(team_orders, columns=unstacked_df.columns)
>>> print result
Year      2015            2016        
Gender    Male  Female    Male  Female
0       Team C  Team A  Team A  Team B
1       Team A  Team D  Team B  Team A
2       Team B  Team B  Team C  Team D
3       Team D  Team C  Team D  Team C

是否有我缺少的更简单/更好的方法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    从您的未堆叠版本开始,您可以使用 .argsort().apply() 对每列进行排序,然后将其用作对索引的查找:

    df.unstack([1,2]).apply(lambda x: x.index[x.argsort()]).reset_index(drop=True)
    
    Year      2015            2016        
    Gender    Male  Female    Male  Female
    0       Team C  Team A  Team A  Team B
    1       Team A  Team D  Team B  Team A
    2       Team B  Team B  Team C  Team D
    3       Team D  Team C  Team D  Team C
    

    编辑:这里有一些关于它为什么起作用的更多信息。只需.argsort(),您将获得:

    print df.unstack([1,2]).apply(lambda x: x.argsort())
    
    Year   2015        2016       
    Gender Male Female Male Female
    Team                          
    Team A    2      0    0      1
    Team B    0      3    1      0
    Team C    1      1    2      3
    Team D    3      2    3      2
    

    查找位本质上只是对每一列执行以下操作:

    df.unstack([1,2]).index[[2,0,1,3]]
    
    Index([u'Team C', u'Team A', u'Team B', u'Team D'], dtype='object', name=u'Team')
    

    .reset_index() 摆脱了现在毫无意义的索引标签。

    【讨论】:

    • 非常好。我了解 argsort 如何提供对每列进行排序的索引,但我不清楚 x.index[x.argsort()] 如何提供正确排序的团队索引。
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2017-08-29
    • 1970-01-01
    • 2016-01-16
    • 2013-06-19
    • 2010-12-22
    • 2011-05-14
    相关资源
    最近更新 更多