首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按2列对熊猫数据进行排序(一列带有整数,一列带有字母数字),并具有整数列的优先级

按2列对熊猫数据进行排序(一列带有整数,一列带有字母数字),并具有整数列的优先级
EN

Stack Overflow用户
提问于 2021-09-02 18:02:37
回答 3查看 628关注 0票数 1

我有一个有两列的数据。

一列有整数: 1,2,3,.10,11,12,.

一个列有字母数字(作为字符串):A1,A2,.A10,A11,。B1,B2,。B10,B11 .(总是一个字母+一个或两个数字,字母A,数字1-12)

目标是按照具有第一优先级的整数列和具有第二优先级的字母数字列对数据进行排序。字母数字列应该排序如下:A1,B1,C1,D1,.A2,B2,C2,D2,.,A3,B3,C3,D3,

(这是生物学/潜水实验室/机器人/自动化/96井板的问题)。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-02 19:44:12

你可以这样做:

digits.

  • Convert

  • 将包含字母数字字符串的第二列拆分为2列:一列Letter用于容纳第一个字母,另一列Number用于从字符串到整数容纳一个或两个Number列的数字。

让我们用下面的例子来说明这个过程:

假设我们有数据df,如下所示:

代码语言:javascript
复制
print(df)

   Col1 Col2
0     2  B12
1    11   C2
2     2   A1
3    11   B2
4     2   B1
5    11  C12
6     2  A12
7    11   C1
8     2   A2

步骤1和步骤2:将Col2 Letter 拆分为2列,Letter & Number +将 Number 列从字符串转换为整数:E 234

代码语言:javascript
复制
df['Letter'] = df['Col2'].str[0]               # take 1st char
df['Number'] = df['Col2'].str[1:].astype(int)  # take 2nd char onwards and convert to integer 

结果:

代码语言:javascript
复制
print(df)

   Col1 Col2 Letter  Number
0     2  B12      B      12
1    11   C2      C       2
2     2   A1      A       1
3    11   B2      B       2
4     2   B1      B       1
5    11  C12      C      12
6     2  A12      A      12
7    11   C1      C       1
8     2   A2      A       2

第三步:优先排序Col1**,** Letter Number Col1 --> Number ->E 263 Letter**:**

代码语言:javascript
复制
df = df.sort_values(by=['Col1', 'Number', 'Letter'])

结果:

代码语言:javascript
复制
print(df)

   Col1 Col2 Letter  Number
2     2   A1      A       1
4     2   B1      B       1
8     2   A2      A       2
6     2  A12      A      12
0     2  B12      B      12
7    11   C1      C       1
3    11   B2      B       2
1    11   C2      C       2
5    11  C12      C      12

排序之后,可以删除LetterNumber列,如下所示:

代码语言:javascript
复制
df = df.drop(['Letter', 'Number'], axis=1)

如果要在一步中完成所有操作,还可以按以下方式链接说明:

代码语言:javascript
复制
df = (df.assign(Letter=df['Col2'].str[0], 
                Number=df['Col2'].str[1:].astype(int))
        .sort_values(by=['Col1', 'Number', 'Letter'])
        .drop(['Letter', 'Number'], axis=1)
     )

结果:

代码语言:javascript
复制
print(df)

   Col1 Col2
2     2   A1
4     2   B1
8     2   A2
6     2  A12
0     2  B12
7    11   C1
3    11   B2
1    11   C2
5    11  C12
票数 2
EN

Stack Overflow用户

发布于 2021-09-02 18:38:45

根据您的示例,您可以首先分离字母数字列,然后对其进行相应的排序。你可以:

代码语言:javascript
复制
df['numericalValue'] = df['alphaNumerical'][1:] # Assuming you only have 1 letter

df = df.sort_values(['numericalValue', 'alphaNumerical'], ascending = (True, True))

这将首先根据数值对数据进行排序,如示例中所示,然后再按其字母排序共享相同数值的值。

如果您有一个可变数目的非数字字符,您可以使用类似于this的内容。

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2021-09-02 19:59:04

您可以使用key参数的sort_values。只需应用转换将“B1”更改为“01B”:

代码语言:javascript
复制
df = pd.DataFrame({'col1': ['C1', 'C1', 'A2', 'B12', 'B1','B2'],
                   'col2': [2,1,3,4,2,5]})

(df.sort_values(by='col2')
   .sort_values(by='col1',
                key=lambda x: x.str[1:].str.pad(2, 'left', '0')+x.str[0])
)

输出:

代码语言:javascript
复制
  col1  col2
4   B1     2
1   C1     1
0   C1     2
2   A2     3
5   B2     5
3  B12     4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69035199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档