Хотите переупорядочить столбцы дат (с месяцем и годом в качестве заголовка) в порядке убывания слева направо. Все столбцы, не относящиеся к дате, смещаются в крайнее левое положение перед началом столбцов даты. Если возможно, поскольку заголовки столбцов имеют смешанный регистр, поэтому их необходимо обрабатывать без учета регистра.
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'] }
Вы можете преобразовать в_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 Конечно, я предполагал DataFrames: demo = pd.DataFrame(demo)
. Я отредактировал ответ, присвоив ему другое имя.
исправленный код у меня не работает, обратитесь к этой строке в моем комментарии key=lambda x: pd.to_datetime(x.str.title(), error='coerce'), у меня работает
@Дэн, какую версию панд ты использовал? Это работает без title
на пандах 2.2.2.
Панды Версия 2.0.3
@Дэн, честно говоря, я добавил примечание в ответ. Спасибо за отзыв.
импортировать панд как 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 г.']
Честно говоря, я ничего не могу понять в этом вопросе. Я понятия не имею, почему названия городов становятся все более и более непонятными.