【问题标题】:Sort pandas dataframe on index that is string+digits根据字符串+数字的索引对熊猫数据框进行排序
【发布时间】:2021-07-03 06:38:18
【问题描述】:

我有以下数据框:

import numpy as np
col1=['A_100','A_30','A_60','B_100','B_30','B_60']
vals=np.random.randint(0,20,size=6).tolist()
df=pd.DataFrame(list(zip(col1,vals)),columns=['index','vals']).set_index('index')

>>>

       vals
index   
A_100   5
A_30    0
A_60    5
B_100   9
B_30    1
B_60    9

我想对数据框进行排序,以便根据字符串的字母和数值进行组织,如下所示:

          val
index
A_100     5
A_60      0
A_30      5
B_100     9
B_60      1
B_30      9

我尝试过使用排序索引:

df.sort_index()

但返回相同的数据帧。
我也尝试通过重置索引和排序值来做到这一点,但我得到了相同的结果:

df=df.reset_index()
df.sort_values('index')
>>>#nothin changed

df['indexNumber'] = df.index.str.rsplit('_').str[-1].astype(int)
df = df.sort_values(['indexNumber']).drop('indexNumber', axis=1)
>>>#new dataframe but now I have it A,B,A,B and I still need the A to be together and then the B
      vals
index   
A_30    5
B_30    0
A_60    5
B_60    9
A_100   1
B_100   9

我认为原因是当它对值进行排序时,它会查看第一个数字,然后 6 大于 3 大于 1,因此它认为已经“排序”,并且它没有t 读 100 数字 100。

有没有简单的方法让它先按字符串排序(a-b-c 顺序),然​​后按数值顺序? (100,60,30)。

【问题讨论】:

    标签: python pandas string sorting digits


    【解决方案1】:

    一个想法是将index转换为Series,将Series.str.split转换为DataFrame,将第二列转换为整数并对两列进行排序,该索引用于原始df.index中的更改顺序DataFrame.reindex

    df1 = df.index.to_series().str.split('_',expand=True)
    df1[1] = df1[1].astype(int)
    df1 = df1.sort_values([0, 1], ascending=[True, False])
    print (df1)
           0    1
    index        
    A_100  A  100
    A_60   A   60
    A_30   A   30
    B_100  B  100
    B_60   B   60
    B_30   B   30
    
    df = df.reindex(df1.index)
    print (df)
           vals
    index      
    A_100     0
    A_60     12
    A_30     13
    B_100    12
    B_60      6
    B_30      6
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2017-01-12
      • 2013-12-15
      • 2018-10-05
      • 2014-12-29
      • 2022-11-02
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多