根据字符串+数字的索引对熊猫数据框进行排序
Posted
技术标签:
【中文标题】根据字符串+数字的索引对熊猫数据框进行排序【英文标题】: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)。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于根据字符串+数字的索引对熊猫数据框进行排序的主要内容,如果未能解决你的问题,请参考以下文章