【发布时间】:2022-01-14 17:31:18
【问题描述】:
我正在创建一个小规模的调度脚本,但遇到了一些 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))
我在一些地方添加了一些“打印(索引)”,看看我是否可以找出问题所在。
我发现底部的 iterrows 循环贯穿每一行。但是,函数中的 itterrows 循环只查看第一行,我不明白为什么。
我正在尝试检查 dataframe_1 中的每个员工姓名(索引),并根据 dataframe_2 中的列名检查该员工姓名。然后,我想删除 dataframe_2 中该特定行的前 3 列(因此是列表和 del days_off[0:3])。
但在本例中,它为“Staff 1”、“Staff 2”和“Staff 3”运行底部 for iterrows 循环(函数外部)。但函数内的 itterrows 循环仅检查“Staff 1”名称。
这意味着它仅适用于“Staff 1”,但当为“Staff 2”调用该函数时,它仅在 dataframe_2 的第一行中检查“Staff 2” - 并没有找到它,因为它在第二行。
这有意义吗?
非常感谢任何帮助。
【问题讨论】:
-
请添加一些示例输入和预期输出——反正它很小。
df.to_clipboard(False)就是为此而生的。而且我知道pandas很难,我宁愿学一次就学对。 -
谢谢,我添加了一些示例数据和更多解释。我查看了 to_clipboard,我不确定这是否适合 - 我可能只是不明白。
-
to_clipboard表示将其复制到剪贴板。然后将其粘贴到您的问题中。节省相当多的打字。另外,您错过了一件事:您的预期输出是什么? -
啊,好的,谢谢 - 这会有所帮助。我希望该函数遍历数据框 2 中的每一行(带有 iterrows),但它似乎只遍历第一行。