如何根据字母和数字对熊猫列进行排序?

时间:2020-01-28 17:05:43

标签: python pandas

我有一个pandas DataFrame,它列出了96或384孔板中的孔,我希望对它们进行排序。这些孔被标记为:

A1, A2, A3, ..., A10, A11, A12, B1, B2, B3,...

在我的熊猫DataFrame中,按well列进行排序可以得到:

A1, A10, A11, A12, A2, A3, ...

但是,上面的排序顺序是我想要的。

除了将列分为字母和数字列,然后按两列排序之外,还有没有其他选择可能更聪明或更简洁?

2 个答案:

答案 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)

仅使用熊猫的解决方案。还可以处理前缀文本的长度可变的情况:Sales1Region1Product1

# 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]