场景:我有一个带有不同数据列的数据,另一个带有日期列表的数据框。
数据框1的示例:
iterationcount datecolumn list
iteration5 1
iteration5 2
iteration3 2
iteration3 2
iteration4 33
iteration3 4
iteration1 5
iteration2 3
iteration5 2
iteration4 22
数据框2的示例:
iteration1 01.01.2018 26.01.2018 30.03.2018
iteration2 01.01.2018 30.03.2018 02.04.2018 25.12.2018 26.12.2018
iteration3
iteration4 01.01.2018 15.01.2018 19.02.2018
iteration5 01.01.2018 19.02.2018 30.03.2018 21.05.2018 02.07.2018 06.08.2018 03.09.2018 08.10.2018 12.11.2018
第二个数据帧是每个迭代的假期列表。它将用于填充第一个数据帧的第二列
约束::对于第一个数据框的每次迭代,用户将选择一个月份和年份:然后脚本将查找该月份的第一个日期。如果该日期在该迭代的dataframe2的日期列表中,则根据程序日历选择下一个工作日期。
示例::用户选择2018年1月,代码返回01/01/2018。对于第一次迭代,该日期是假期,因此选择下一个工作日(在本例中为02/01/2018),然后将此日期输入到与该迭代对应的所有dataframe1中:
iterationcount datecolumn list
iteration5 1
iteration5 2
iteration3 2
iteration3 2
iteration4 33
iteration3 4
iteration1 02/01/2018 5
iteration2 3
iteration5 2
iteration4 22
然后转到下一个迭代(某些迭代将具有相同的日历日期)。
代码:到目前为止,我已经尝试了多种方法,但是无法实现结果。我认为最接近的是:
import pandas as pd
import datetime
import os
from os import listdir
from os.path import isfile, join
import glob
## Get Adjustments
mypath3 = "//DGMS/Desktop/Uploader_v1.xlsm"
ApplyOnDates = pd.read_excel(open(mypath3, 'rb'), sheet_name='Holidays')
# Get content
mypath = "//DGMS/Desktop/Uploaded"
all_files = glob.glob(os.path.join(mypath, "*.xls*"))
contentdataframes = []
contentdataframes2 = []
for f in all_files:
df = pd.read_excel(f)
df['Name'] = os.path.basename(f).split('.')[0].split('_')[0]
df['ApplyOn']= ''
mask = df.columns.str.contains('Base|Last|Fixing|Cash')
c2 = df.columns[~mask].tolist()
df = df[c2]
contentdataframes.append(df)
finalfinal = pd.concat(contentdataframes2)
for row in finalfinal.Name.itertuple():
datedatedate = datetime.datetime(2018, 01, 1)
if (pd.np.where(ApplyOnDates.Index.str.contains(finalfinal(row)).isin(datedatedate) = True:
datetouse = datedatedate + datetime.timedelta(days=1)
else:
datetouse = datedatedate
finalfinal['ApplyOn'] = datetouse
问题:基本上,我的主要麻烦是无法匹配两个数据框中的行并在假期数据框的列中搜索日期。有适当的方法做到这一点吗?
Obs:通过使用excel的功能(vlookup,match ...),我能够直接在vba中获得类似的结果,问题是每次使用excel进行数据处理基本上会使文件崩溃
答案 0 :(得分:0)
所以您想基本上将dataframe2的列合并到dataframe1吧?尝试使用合并:
newdf = pd.DataFrame.merge(dataframe1, dataframe2, left_on='iterationcount',
right_on='iterationcount', how='inner', indicator=False)
那应该给您一个新的框架。