我有两个数据框,一个带有日期列表及其对应的假期(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。我查看了date to date comparison,从中得到的答案是将它们作为字符串进行比较,因此为什么要以这种方式构造函数。
我在做什么错?我已经将df2['DATE']
列预先格式化为具有相同的strftime()
我能想到的唯一直接的选择是从一个df到另一个df使用df.lookup
,但是我不确定该怎么做。
答案 0 :(得分:1)
要使if语句执行您期望的操作,您需要从df2['DATE']
操作返回的Series中获取列表或numpy数组。您可以通过使用.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
答案 1 :(得分:1)
将您的系列转换为列表应该可以解决您的问题:
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