【问题标题】:how to sort pandas dataframe from one column如何从一列中对熊猫数据框进行排序
【发布时间】:2016-10-13 18:01:08
【问题描述】:

我有一个这样的数据框:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

如您所见,月份不是按日历顺序排列的。所以我创建了第二列来获取每个月(1-12)对应的月份数。从那里,我如何根据日历月的顺序对这个数据框进行排序?

【问题讨论】:

    标签: python pandas dataframe sorting time


    【解决方案1】:

    使用 sort_values 按特定列的值对 df 进行排序:

    In [18]:
    df.sort_values('2')
    
    Out[18]:
            0          1     2
    4    85.6    January   1.0
    3    95.5   February   2.0
    7   104.8      March   3.0
    0   354.7      April   4.0
    8   283.5        May   5.0
    6   238.7       June   6.0
    5   152.0       July   7.0
    1    55.4     August   8.0
    11  212.7  September   9.0
    10  249.6    October  10.0
    9   278.8   November  11.0
    2   176.5   December  12.0
    

    如果要按两列排序,请将列标签列表传递给sort_values,列标签根据排序优先级排序。如果您使用df.sort_values(['2', '0']),则结果将按列2 排序,然后按列0。诚然,这对于本示例来说实际上没有意义,因为 df['2'] 中的每个值都是唯一的。

    【讨论】:

    • 上述解决方案对我不起作用。它应该根据下面的答案进行更改。
    • @NafeesAhmad OP 希望结果按升序排列,这与其他答案不同
    【解决方案2】:

    只是在数据上添加更多操作。假设我们有一个数据框df,我们可以做几个操作来得到想要的输出

    ID         cost      tax    label
    1       216590      1600    test      
    2       523213      1800    test 
    3          250      1500    experiment
    
    (df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)
    

    将标签的sorted 输出为dataframe

        index   label
    0   test        2
    1   experiment  1
    

    【讨论】:

      【解决方案3】:

      我尝试了上述解决方案,但没有取得成果,因此我找到了一个适合我的不同解决方案。 ascending=False 是按descending 顺序排列数据帧,默认为True。我正在使用 python 3.6.6 和 pandas 0.23.4 版本。

      final_df = df.sort_values(by=['2'], ascending=False)
      

      您可以在 pandas 文档here 中查看更多详细信息。

      【讨论】:

        【解决方案4】:

        就像另一种解决方案:

        不用创建第二列,您可以对字符串数据(月份名称)进行分类并按如下方式排序:

        df.rename(columns={1:'month'},inplace=True)
        df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
        df = df.sort_values('month',ascending=False)
        

        它将按照您在创建Categorical 对象时指定的方式为您提供month name 的有序数据。

        【讨论】:

          【解决方案5】:

          这里是根据 pandas 文档的 sort_values 模板。

          DataFrame.sort_values(by, axis=0,
                                    ascending=True,
                                    inplace=False,
                                    kind='quicksort',
                                    na_position='last',
                                    ignore_index=False, key=None)[source]
          

          在这种情况下,它将是这样的。

          df.sort_values(by=['2'])

          API 参考pandas.DataFrame.sort_values

          【讨论】:

            【解决方案6】:

            使用列名对我有用。

            sorted_df = df.sort_values(by=['Column_name'], ascending=True)
            

            【讨论】:

              【解决方案7】:

              这对我有用

              df.sort_values(by='Column_name', inplace=True, ascending=False)
              

              【讨论】:

                【解决方案8】:

                Panda 的 sort_values 完成这项工作。

                如果打算保持相同的变量名,请不要忘记inplace=True(这会就地执行操作)

                df.sort_values(by=['2'], inplace=True)
                

                不妨将更改(排序)分配给一个可能具有相同名称的变量,例如df as

                df = df.sort_values(by=['2'])
                

                忘记上述步骤可能会导致(如this user)无法获得预期的结果。

                注意,如果要按降序排列,则需要通过ascending=False,如

                df = df.sort_values(by=['2'], ascending=False)
                

                【讨论】:

                  【解决方案9】:

                  这个对我有用:

                  df=df.sort_values(by=[2])
                  

                  鉴于:

                  df=df.sort_values(by=['2']) 
                  

                  不工作。

                  【讨论】:

                    【解决方案10】:

                    示例: 假设您有一列的值为 1 和 0,并且您想分离并只使用一个值,那么:

                    //家具是csv文件中的列之一。

                    allrooms = data.groupby('家具')['家具'].agg('count') 所有房间

                    myrooms1 = pan.DataFrame(allrooms, columns = ['furniture'], index = [1])

                    myrooms2 = pan.DataFrame(allrooms, columns = ['furniture'], index = [0])

                    打印(我的房间1);打印(我的房间2)

                    【讨论】:

                    • 图片是一种非常糟糕的代码呈现方式。而是将其作为文本发布,这对每个人来说都更容易
                    • 尝试通过发布代码本身来保持调试友好。 idownvotedbecau.se/imageofcode
                    【解决方案11】:

                    您可能需要在排序后重置索引:

                    df = df.sort_values('2')
                    df = df.reset_index(drop=True)
                    

                    【讨论】:

                      猜你喜欢
                      • 2015-11-06
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-12-29
                      • 1970-01-01
                      • 2019-04-12
                      相关资源
                      最近更新 更多