Может ли кто-нибудь помочь мне с работой, которую я выполняю, у меня есть фрейм данных со столбцом (A) со значениями str, такими как: '1 month', '2 month', '13-16 месяцев ',' + 24 месяца ',' 20-21 месяц '... и еще один столбец с числовыми значениями (B), и мне нужно отсортировать строки, используя эти два столбца, или которые я использую:

1 df.sort_values ​​(['A', 'B'])

Моя проблема в том, что месяцы упорядочены так: +24 месяца, 1 месяц, 13-, 2, 20-, 3, .....

Кто-нибудь знает, как это можно выразить: 1, 2, 3, ...., 13-, 20-, +24

Большое спасибо вам

0
Santi 17 Май 2021 в 12:54

2 ответа

Лучший ответ

Сначала вы можете извлечь первое целое число, используя .str.extract() в новый столбец с именем A_num и используйте его для сортировки следующим образом:

(df.assign(A_num=df['A'].str.extract(r'(\d+)').astype(int))
   .sort_values(['A_num', 'B'])
   .drop(columns='A_num'))

Тестовый забег

df = pd.DataFrame({'A': ['1 months', '2 months', '13 -16 months ',' + 24 months ', '20 -21 months'], 'B': [4, 3, 5, 2, 1]})

(df.assign(A_num=df['A'].str.extract(r'(\d+)').astype(int))
   .sort_values(['A_num', 'B'])
   .drop(columns='A_num'))


                A  B
0        1 months  4
1        2 months  3
2  13 -16 months   5
4   20 -21 months  1
3    + 24 months   2
1
SeaBean 17 Май 2021 в 10:17

Вам нужно получить столбец из первого столбца, чтобы получить значения месяца, а затем отсортировать по этому производному столбцу и второму столбцу. Попробуйте что-нибудь подобное.

import pandas as pd
import re

df = pd.read_csv("Book1.csv", names=["A", "B"])
'''
                 A       B
0       1 months'   Test 1
1        2 months'  Test 2
2  13 -16 months '  Test 3
3      + 24 months  Test 4
4   20 -21 months'  Test 5
'''

df["C"] = df.apply(lambda row: int(re.sub(r"[^\d\s\-]","",row[0]).strip().split()[0]), axis=1)
'''
calculate the derived column from first column by getting the first month from string and convert it to int
                 A       B   C
0       1 months'   Test 1   1
1        2 months'  Test 2   2
2  13 -16 months '  Test 3  13
3      + 24 months  Test 4  24
4   20 -21 months'  Test 5  20
'''
df.sort_values(["C", "B"], inplace=True)
'''
sort the dataframe by Derived column 'c' and 'b'
                 A       B   C
0       1 months'   Test 1   1
1        2 months'  Test 2   2
2  13 -16 months '  Test 3  13
4   20 -21 months'  Test 5  20
3      + 24 months  Test 4  24
'''
df.drop("C", axis=1, inplace=True)
'''
finally drop the derived column 'c'
                 A       B
0       1 months'   Test 1
1        2 months'  Test 2
2  13 -16 months '  Test 3
4   20 -21 months'  Test 5
3      + 24 months  Test 4
'''
0
Roy 17 Май 2021 в 11:05