Я пытаюсь назначить классификатор Holiday списку дат - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть два кадра данных, один со списком дат и соответствующих им выходных (df2), а другой со списком транзакций (df1).Я пытаюсь использовать первый, чтобы пометить выходные на втором, но всякий раз, когда я пытаюсь создать функцию и применить ее, она просто возвращает пустые значения для всего.

Я использую следующую функцию:

    def isHoliday(t, holiday_list):
        f = t.strftime('%Y-%m-%d')
        if(f in (holiday_list)):
            return 1
        else:
            return 0

И когда я пытаюсь применить ее:

    df1.insert(3, 'isHoliday', df1['DATE'].apply(lambda x: isHoliday(x, 
    df2['DATE'])))

Фрейм данных возвращает только 0.Я посмотрел сравнение по дате , и я получил ответ на него, чтобы сравнить их как строки, и поэтому функция структурирована таким образом.

Что я делаю неправильно?Я уже предварительно отформатировал столбец df2['DATE'] как строку с тем же strftime()

Единственная прямая альтернатива, о которой я могу подумать, - это использовать df.lookup от одного df к другому, но я неуверен, как это сделать.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Преобразование вашей серии в список должно решить вашу проблему:

def isHoliday(t, holiday_list):
    f = t.strftime('%Y-%m-%d')
    if f in list(holiday_list):  # convert series to list
        return 1
    else:
        return 0
1 голос
/ 26 апреля 2019

Чтобы оператор if сделал то, что вы ожидаете, вам нужно получить список или массив с пустыми значениями из Series, возвращенной операцией df2['DATE']. Вы можете сделать это, используя свойство .values или преобразовав серию в список list(df2['DATE']):

import pandas as pd
df2 = pd.DataFrame(data=[['2014-01-02'], ['2014-01-03']], columns=['DATE'])
print('2014-01-02' in df2['DATE']) # false
print('2014-01-02' in df2['DATE'].values) # true
print('2014-01-02' in list(df2['DATE'])) # true

Кроме того, метод .str.contains() может сравнить все строки, а затем any() найдет совпадение.

any(df2['DATE'].str.contains('2014-01-02', regex=False)) # true
...