Может ли кто-нибудь помочь мне с работой, которую я выполняю, у меня есть фрейм данных со столбцом (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
Большое спасибо вам
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
Вам нужно получить столбец из первого столбца, чтобы получить значения месяца, а затем отсортировать по этому производному столбцу и второму столбцу. Попробуйте что-нибудь подобное.
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
'''
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.