Как правильно ссылаться на столбцы с кириллическими названиями в функции python

Рейтинг: 0Ответов: 1Опубликовано: 20.08.2023

Написал следующий код и он работает корректно, но почему-то только после того, как я переименовал заголовки столбцов в латиницу. Подскажите как правильно ссылаться на заголовки написанные на кириллице, чтобы в функции можно было ссылаться на кириллические названия заголовков, например на Дата начала, вместо start_date

#загружаем библиотеки
import pandas as pd
import datetime

#адрес папки
pp_path='C:/Users/Макс/Desktop/ПП.xlsx'

# загружаем данные
pp_excel_data = pd.read_excel(pp_path)

# переименовываем заголовки
pp_excel_data.rename(columns={"Дата начала": "start_date","Дата окончания": "end_date","ДатаКалендарь": "date",}, inplace=True)

#функция
def check_range(start_date, end_date, date):
    if start_date <= date <= end_date:
        return True
    else:
        return False

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(lambda row: check_range(row["start_date"], row["end_date"], row["date"]), axis=1)

display(pp_excel_data)

Вот итоговый корректно работающий вариант кода, который был предложен в ответе :

#загружаем библиотеки
import pandas as pd
import numpy as np
import datetime

#адрес папки
pp_path='C:/Users/Макс/Desktop/ПП.xlsx'

# загружаем данные по бюджету проектов
pp_excel_data = pd.read_excel(pp_path)

#функция
def check_range(x):
    return x["Дата начала"]<= x["ДатаКалендарь"]<= x["Дата окончания"]

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(check_range, axis=1)

display(pp_excel_data)

Ответы

▲ 1Принят

Думаю, что в вашем случае можно передавать в функцию не отдельные скаляры, а строку целиком:

#функция
def check_range(x):
    return x["Дата начала"]<= x["ДатаКалендарь"]<= x["Дата окончания"]:

#создание нового столбца
pp_excel_data["is_in_range"] = pp_excel_data.apply(check_range), axis=1)

Дополню. Вообще apply работает довольно медленно, поэтому лучше применить другие способы:

# подготовка данных
df = pd.DataFrame({'Дата начала': ['01.01.2023', '01.02.2023', '01.03.2023'],
                   'Дата окончания': ['15.01.2023', '20.02.2023', '30.03.2023'],
                   'Дата': ['10.01.2023', '25.02.2023', '28.03.2023']})
df = df.apply(lambda x: pd.to_datetime(x, format='mixed', dayfirst=True))
# вычисление столбца is_in_range
df["is_in_range"] = df['Дата начала'].le(df['Дата']) & df['Дата'].le(df['Дата окончания'])
# или
df["is_in_range"] = df['Дата'].between(df['Дата начала'], df['Дата окончания'])
print(df)
  Дата начала Дата окончания       Дата  is_in_range
0  2023-01-01     2023-01-15 2023-01-10         True
1  2023-02-01     2023-02-20 2023-02-25        False
2  2023-03-01     2023-03-30 2023-03-28         True