【问题标题】:Using pandas to order a dataframe alphabetically by values in one column and one row使用熊猫按一列一行中的值按字母顺序排列数据框
【发布时间】:2018-08-23 10:02:46
【问题描述】:

问题

我正在尝试同时按两个不同的变量对数据框进行排序,我将发布我的数据框的一个小子样本作为示例:

+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
|                           | Caldisericumexile | Haloplasmacontractile | Chthonomonascalidirosea | Desulfurispirillumindicum | Chrysiogenesarsenatis | Gracilimonastropica | Balneolavulgaris |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Caldisericumexile         | 0                 | 11.313708499          | 11.313708499            | 271.970586645             | 271.970586645         | 271.970586645       | 271.970586645    |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Haloplasmacontractile     | 11.313708499      | 0                     | 11.313708499            | 271.970586645             | 271.970586645         | 271.970586645       | 271.970586645    |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Chthonomonascalidirosea   | 11.313708499      | 11.313708499          | 0                       | 271.970586645             | 271.970586645         | 271.970586645       | 271.970586645    |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Desulfurispirillumindicum | 271.970586645     | 271.970586645         | 271.970586645           | 0                         | 11.313708499          | 25.2982212813       | 25.2982212813    |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Chrysiogenesarsenatis     | 271.970586645     | 271.970586645         | 271.970586645           | 11.313708499              | 0                     | 25.2982212813       | 25.2982212813    |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Gracilimonastropica       | 271.970586645     | 271.970586645         | 271.970586645           | 25.2982212813             | 25.2982212813         | 0                   | 11.313708499     |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+
| Balneolavulgaris          | 271.970586645     | 271.970586645         | 271.970586645           | 25.2982212813             | 25.2982212813         | 11.313708499        | 0                |
+---------------------------+-------------------+-----------------------+-------------------------+---------------------------+-----------------------+---------------------+------------------+

期望的输出

我想使用 pandas 按字母顺序(降序)沿着带有字母字符的列和带有字母字符的行排列,例如:

+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
|                           | Balneolavulgaris | Caldisericumexile | Chrysiogenesarsenatis | Chthonomonascalidirosea | Desulfurispirillumindicum | Gracilimonastropica | Haloplasmacontractile |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Balneolavulgaris          | 0                | 271.970586645     | 25.2982212813         | 271.970586645           | 25.2982212813             | 11.313708499        | 271.970586645         |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Caldisericumexile         | 271.970586645    | 0                 | 271.970586645         | 11.313708499            | 271.970586645             | 271.970586645       | 11.313708499          |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Chrysiogenesarsenatis     | 25.2982212813    | 271.970586645     | 0                     | 271.970586645           | 11.313708499              | 25.2982212813       | 271.970586645         |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Chthonomonascalidirosea   | 271.970586645    | 11.313708499      | 271.970586645         | 0                       | 271.970586645             | 271.970586645       | 11.313708499          |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Desulfurispirillumindicum | 25.2982212813    | 271.970586645     | 11.313708499          | 271.970586645           | 0                         | 25.2982212813       | 271.970586645         |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Gracilimonastropica       | 11.313708499     | 271.970586645     | 25.2982212813         | 271.970586645           | 25.2982212813             | 0                   | 271.970586645         |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+
| Haloplasmacontractile     | 271.970586645    | 11.313708499      | 271.970586645         | 11.313708499            | 271.970586645             | 271.970586645       | 0                     |
+---------------------------+------------------+-------------------+-----------------------+-------------------------+---------------------------+---------------------+-----------------------+

是否可以在 pandas 中用未命名的列和行在一行中执行此操作?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    通过排序索引和列名使用reindex:

    df = df.reindex(index=sorted(df.index), columns=sorted(df.columns))
    

    print (df)
                               Balneolavulgaris  Caldisericumexile  \
    Balneolavulgaris                   0.000000         271.970587   
    Caldisericumexile                271.970587           0.000000   
    Chrysiogenesarsenatis             25.298221         271.970587   
    Chthonomonascalidirosea          271.970587          11.313708   
    Desulfurispirillumindicum         25.298221         271.970587   
    Gracilimonastropica               11.313708         271.970587   
    Haloplasmacontractile            271.970587          11.313708   
    
                               Chrysiogenesarsenatis  Chthonomonascalidirosea  \
    Balneolavulgaris                       25.298221               271.970587   
    Caldisericumexile                     271.970587                11.313708   
    Chrysiogenesarsenatis                   0.000000               271.970587   
    Chthonomonascalidirosea               271.970587                 0.000000   
    Desulfurispirillumindicum              11.313708               271.970587   
    Gracilimonastropica                    25.298221               271.970587   
    Haloplasmacontractile                 271.970587                11.313708   
    
                               Desulfurispirillumindicum  Gracilimonastropica  \
    Balneolavulgaris                           25.298221            11.313708   
    Caldisericumexile                         271.970587           271.970587   
    Chrysiogenesarsenatis                      11.313708            25.298221   
    Chthonomonascalidirosea                   271.970587           271.970587   
    Desulfurispirillumindicum                   0.000000            25.298221   
    Gracilimonastropica                        25.298221             0.000000   
    Haloplasmacontractile                     271.970587           271.970587   
    
                               Haloplasmacontractile  
    Balneolavulgaris                      271.970587  
    Caldisericumexile                      11.313708  
    Chrysiogenesarsenatis                 271.970587  
    Chthonomonascalidirosea                11.313708  
    Desulfurispirillumindicum             271.970587  
    Gracilimonastropica                   271.970587  
    Haloplasmacontractile                   0.000000  
    

    【讨论】:

    • 我认为它使用的是 pandas 索引而不是列,这很好地对行进行了排序,但是它用数字索引替换了字母字符。
    • @Biomage - 没错,所以首先需要df = df.set_index('first col')。
    • 或 df = pd.read_csv('data.csv',index_col=0) 在这种情况下为我。谢谢!
    【解决方案2】:

    尝试使用直接设置列(意思是 [...])然后对索引执行相同的操作 .T:

    >>> import pandas as pd
    >>> df=pd.DataFrame({'c':[1,2,3],'a':['a','b','c'],'b':[4,5,6]},index=list('bca'))
    >>> df=df[sorted(df.columns.tolist())]
    >>> df=df.T[sorted(df.index.tolist())].T
    >>> df
       a  b  c
    a  c  6  3
    b  a  4  1
    c  b  5  2
    >>> 
    

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2021-11-05
      • 2023-04-04
      • 2021-12-07
      相关资源
      最近更新 更多