我有一个pandas DataFrame,它列出了96或384孔板中的孔,我希望对它们进行排序。这些孔被标记为:
A1, A2, A3, ..., A10, A11, A12, B1, B2, B3,...
在我的熊猫DataFrame中,按well
列进行排序可以得到:
A1, A10, A11, A12, A2, A3, ...
但是,上面的排序顺序是我想要的。
除了将列分为字母和数字列,然后按两列排序之外,还有没有其他选择可能更聪明或更简洁?
答案 0 :(得分:5)
IIUC,您可以尝试:
l = ['A1', 'A10', 'A3', 'A2', 'A11', 'A12', 'B1', 'B2', 'B3']
sorted(l,key = lambda x: (x[0],int(x[1:])))
或natsort
:
import natsort as ns
ns.natsorted(l)
['A1', 'A2', 'A3', 'A10', 'A11', 'A12', 'B1', 'B2', 'B3']
['A1', 'A2', 'A3', 'A10', 'A11', 'A12', 'B1', 'B2', 'B3']
答案 1 :(得分:0)
仅使用熊猫的解决方案。还可以处理前缀文本的长度可变的情况:Sales1
,Region1
,Product1
等
# Extract the columns into a separate series and sort the series
s = df.columns.to_series()
s.index = s.str.extract('(\D+)(?P<num>\d+)').assign(num=lambda x: x['num'].astype('int'))
s.sort_index(inplace=True)
# Access the columns in sorted order. Note that you are not changing
# the dataframe at all
df[s]