使用.str.extract() 用正则表达式一次性提取中间数字和最后一个数字:
import pandas as pd
from io import StringIO
text = """
values
x15_6_30
x15_6_26
x15_3_137
x15_9_139
x15_10_143
"""
df = pd.read_csv(StringIO(text), sep='\s+', header=0)
df[['middle_number', 'last_number']] = df['values'].str.extract(
pat='_([0-9]+)_([0-9]+)',
expand=True,
).astype(int)
df.sort_values(by=['middle_number', 'last_number', 'values'])
+----+------------+-----------------+---------------+
| | values | middle_number | last_number |
|----+------------+-----------------+---------------|
| 2 | x15_3_137 | 3 | 137 |
| 1 | x15_6_26 | 6 | 26 |
| 0 | x15_6_30 | 6 | 30 |
| 3 | x15_9_139 | 9 | 139 |
| 4 | x15_10_143 | 10 | 143 |
+----+------------+-----------------+---------------+
更简单的解决方案是使用.str.split() 并在下划线处拆分。
使用参数 .str.split(expand=True) 确保您从 3 个单独的列中获取所有 3 个值:
df[['first_value', 'middle_value', 'last_value']] = df['values'].str.split(
pat='_',
expand=True,
)
df[['middle_value', 'last_value']] = df[['middle_value', 'last_value']].astype(int)
df = df.sort_values(by=['middle_value', 'last_value', 'first_value'])
+----+------------+---------------+----------------+--------------+
| | values | first_value | middle_value | last_value |
|----+------------+---------------+----------------+--------------|
| 2 | x15_3_137 | x15 | 3 | 137 |
| 1 | x15_6_26 | x15 | 6 | 26 |
| 0 | x15_6_30 | x15 | 6 | 30 |
| 3 | x15_9_139 | x15 | 9 | 139 |
| 4 | x15_10_143 | x15 | 10 | 143 |
+----+------------+---------------+----------------+--------------+