我正在创建一个小规模的调度脚本,并且在iterrows方面有一些问题。这些是非常小的df,所以时间是最少的(6行和7/8列),尽管我猜这些循环不是最有效的-我对此还是个新手!
这是我已经拥有的
data = {'Staff 1': ['9-5', '9-5', '9-5', '9-5', '9-5'],
'Staff 2': ['9-5', '9-5', '9-5', '9-5', '9-5'],
'Staff 3': [ '9-5', '9-5', '9-5', '9-5', '9-5']}
dataframe_1 = pd.DataFrame.from_dict(data, orient='index',
columns=['9/2/19', '9/3/19', '9/4/19', '9/5/19', '9/6/19'])
data2 = {'Name': ['Staff 1','Staff 2','Staff 3'], 'Site': ['2','2','2'], 'OT':['yes','yes','no'],
'Days off':['','9/4/19','9/4/19'], '':['','','9/5/19']}
dataframe_2 = pd.DataFrame.from_dict(data2)
def annual_leave(staff, df):
df = df.reset_index(drop=True)
for index, row in df.iterrows():
days_off = []
if df.loc[index,'Name'] == '{}'.format(staff):
for cell in row:
days_off.append(cell)
del days_off[0:3]
else:
pass
return days_off
for index, row in dataframe_1.iterrows():
print(annual_leave(index, dataframe_2))
我在一些地方添加了一些'print(index)‘,看看我是否能找出哪里出了问题。
我发现底部的iterrows循环遍历每一行。然而,函数中的itterrows循环只查看第一行,我不明白为什么。
我尝试遍历dataframe_1中的每个职员姓名(索引),并根据dataframe_2中的列名检查该职员姓名,然后我想去掉dataframe_2中特定行的前3列(因此是list和del days_off0:3)。
然而,在本例中,它为'Staff 1‘、'Staff 2’和'Staff 3‘运行了底部for iterrows循环(在函数外部)。但是函数内部的itterrows循环只检查'Staff 1‘名称。
这意味着它只对'Staff 1‘有效,但当为'Staff 2’调用函数时,它只检查dataframe_2的第一行中的'Staff 2‘-并且找不到它,因为它在第二行。
这有什么意义吗?
任何帮助都是非常感谢的。
发布于 2019-08-15 10:56:02
您是否尝试过调用该函数?执行上面给出的代码只会创建一个函数,您需要通过传递适当的参数来调用它来查看输出。我在代码中找不到任何其他错误。如果我错了,请改正。
https://stackoverflow.com/questions/57504287
复制相似问题