Pandas: перестановка столбцов с датой года в качестве заголовка

Хотите переупорядочить столбцы дат (с месяцем и годом в качестве заголовка) в порядке убывания слева направо. Все столбцы, не относящиеся к дате, смещаются в крайнее левое положение перед началом столбцов даты. Если возможно, поскольку заголовки столбцов имеют смешанный регистр, поэтому их необходимо обрабатывать без учета регистра.

demo = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Apr 2022': ['New', 'Los', 'Chic', 'Hous'],
'aPRil 2024': ['York', 'Anges', 'cago', 'ston'],
'Vanilla': ['nfd', 'bdfh', 'tyii', 'liu'],
'aUg 2023': ['NewYork', 'LosAngeles', 'Chicago', 'Houston'],
'deC 2022': ['Neork', 'Logeles', 'Chago', 'Hoston'] }

result = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'Vanilla': ['nfd', 'bdfh', 'tyii', 'liu'],
    'aPRil 2024': ['York', 'Anges', 'cago', 'ston'],
    'aUg 2023': ['NewYork', 'LosAngeles', 'Chicago', 'Houston'],
    'deC 2022': ['Neork', 'Logeles', 'Chago', 'Hoston'],
    'Apr 2022': ['New', 'Los', 'Chic', 'Hous'] }

Честно говоря, я ничего не могу понять в этом вопросе. Я понятия не имею, почему названия городов становятся все более и более непонятными.

roganjosh 09.08.2024 11:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете преобразовать в_datetime с помощью errors='coerce' as key в sort_index. Кроме того, передайте ascending=False, na_position='first' в качестве параметров, чтобы получить даты в порядке убывания и сначала те, которые не являются датами:

df = pd.DataFrame(demo)

result = df.sort_index(
    axis=1,
    key=lambda x: pd.to_datetime(x, errors='coerce', format='mixed'),
    ascending=False,
    na_position='first',
)

Обратите внимание, что в зависимости от версии pandas может потребоваться сначала предварительная обработка строки, чтобы гомогенизировать регистр: key=lambda x: pd.to_datetime(x.str.title(), errors='coerce').

Выход:

      Name  Age Vanilla aPRil 2024    aUg 2023 deC 2022 Apr 2022
0    Alice   25     nfd       York     NewYork    Neork      New
1      Bob   30    bdfh      Anges  LosAngeles  Logeles      Los
2  Charlie   35    tyii       cago     Chicago    Chago     Chic
3    David   40     liu       ston     Houston   Hoston     Hous

Для сортировки столбцов будет использоваться следующее промежуточное звено:

pd.to_datetime(df.columns, errors='coerce', format='mixed')

DatetimeIndex(['NaT', 'NaT', '2022-04-01', '2024-04-01', 'NaT', '2023-08-01',
               '2022-12-01'],
              dtype='datetime64[ns]', freq=None)

AttributeError: объект 'dict' не имеет атрибута 'sort_index', измененного на # Сортировка столбцов DataFrame на основе формата даты result = df.sort_index( axis=1, key=lambda x: pd.to_datetime(x.str.title( ), error='coerce'), возрастание=False, na_position='first', ) print(result)

Dan 09.08.2024 11:34

@Dan Конечно, я предполагал DataFrames: demo = pd.DataFrame(demo). Я отредактировал ответ, присвоив ему другое имя.

mozway 09.08.2024 11:35

исправленный код у меня не работает, обратитесь к этой строке в моем комментарии key=lambda x: pd.to_datetime(x.str.title(), error='coerce'), у меня работает

Dan 09.08.2024 11:46

@Дэн, какую версию панд ты использовал? Это работает без title на пандах 2.2.2.

mozway 09.08.2024 11:48

Панды Версия 2.0.3

Dan 09.08.2024 12:01

@Дэн, честно говоря, я добавил примечание в ответ. Спасибо за отзыв.

mozway 09.08.2024 12:07

импортировать панд как pd

demo = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'Age': [25, 30, 35, 40],
    'Apr 2022': ['New', 'Los', 'Chic', 'Hous'],
    'aPRil 2024': ['York', 'Anges', 'cago', 'ston'],
    'Vanilla': ['nfd', 'bdfh', 'tyii', 'liu'],
    'aUg 2023': ['NewYork', 'LosAngeles', 'Chicago', 'Houston'],
    'deC 2022': ['Neork', 'Logeles', 'Chago', 'Hoston']
}

df = pd.DataFrame (демо)

Сортировка столбцов

sorted_columns = sorted(df.columns, key=lambda x: pd.to_datetime(x, errors='coerce'), reverse=True)

Переместить столбцы без даты влево

date_columns = [col for col in sorted_columns if pd.to_datetime(col, errors='coerce') is not pd.NaT]
non_date_columns = [col for col in df.columns if col not in date_columns]
result = df[non_date_columns + date_columns]

печать (результат)

output: 

      Name  Age Vanilla aPRil 2024    aUg 2023     deC 2022  Apr 2022
0    Alice   25     nfd      York    NewYork     Neork       New
1      Bob   30    bdfh     Anges  LosAngeles   Logeles       Los
2  Charlie   35     tyii      cago     Chicago     Chago       Chic
3    David   40     liu      ston    Houston     Hoston       Hous

Объяснение:

1. Convert Columns to Dates: Columns are sorted based on their parsed
    datetime values. 
 2. Handle Non-Date Columns: Non-date columns are identified and kept on the left. 
 3. Combine and Reorder: Non-date
    columns are placed on the left, and date columns are sorted in
    descending order to the right.

мой результат date_columns Out[44]: ['апрель 2024 г.', 'апрель 2022 г.', 'август 2023 г.', 'декабрь 2022 г.']

Dan 09.08.2024 11:40

Другие вопросы по теме