我有一个有两列的数据。
一列有整数: 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井板的问题)。
有什么想法吗?
发布于 2021-09-02 19:44:12
你可以这样做:
digits.
Letter用于容纳第一个字母,另一列Number用于从字符串到整数容纳一个或两个Number列的数字。让我们用下面的例子来说明这个过程:
假设我们有数据df,如下所示:
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
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 结果:
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**:**
df = df.sort_values(by=['Col1', 'Number', 'Letter'])结果:
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排序之后,可以删除Letter和Number列,如下所示:
df = df.drop(['Letter', 'Number'], axis=1)如果要在一步中完成所有操作,还可以按以下方式链接说明:
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)
)结果:
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发布于 2021-09-02 18:38:45
根据您的示例,您可以首先分离字母数字列,然后对其进行相应的排序。你可以:
df['numericalValue'] = df['alphaNumerical'][1:] # Assuming you only have 1 letter
df = df.sort_values(['numericalValue', 'alphaNumerical'], ascending = (True, True))这将首先根据数值对数据进行排序,如示例中所示,然后再按其字母排序共享相同数值的值。
如果您有一个可变数目的非数字字符,您可以使用类似于this的内容。
祝好运!
发布于 2021-09-02 19:59:04
您可以使用key参数的sort_values。只需应用转换将“B1”更改为“01B”:
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])
)输出:
col1 col2
4 B1 2
1 C1 1
0 C1 2
2 A2 3
5 B2 5
3 B12 4https://stackoverflow.com/questions/69035199
复制相似问题