我有一个数据框架,其中包含人员配备值(上限)和分配的行。
我需要重复遍历每一行,直到我的分配达到我的人手价值为止。我的分配从0开始。一旦我的分配达到人员配置值,就移到下一行。
这只是我正在构建的程序的第一部分,稍后我会遇到更多限制,这就是为什么我不只是将“分配”设置为“人员配备价值”的原因。
我已经尝试了以下操作,但是我收到并警告FutureWarning错误:get_value已过时,并将在以后的版本中删除。请改用.at[]
或.iat[]
访问器。
for row in springdf.index:
q = springdf.get_value(row,'Allocation')
if q:
p = springdf.get_value(row, 'StaffingStandardValue')
while q < p:
springdf.set_value(row, 'Allocation', q+1)
也尝试过:
for row in springdf.index:
q = springdf.iloc(row,'Allocation')
if q:
p = springdf.iloc(row, 'StaffingStandardValue')
if q < p:
springdf.set_value(row, 'Allocation', q+1)
但收到错误:__call__() takes from 1 to 2 positional arguments but 3 were given
我实际上需要覆盖旧“分配”的值,并在“分配”时更改数据帧,而不仅仅是返回结果。该数据框最终将输出到excel文件中。
感谢您的帮助!
答案 0 :(得分:1)
对于索引值,我建议使用df['column_name']
,您可以按名称选择列:for row in springdf.index:
q = springdf['Allocation'].loc[row]
if q:
p = springdf['StaffingStandardValue'].loc[row]
while q < p:
springdf['Allocation'].loc[row] = q + 1
q = springdf['Allocation'].loc[row]
。将它们放在一起可以获得:
for row in springdf.index:
q = springdf.at[row, 'Allocation']
if q:
p = springdf.at[row, 'StaffingStandardValue']
while q < p:
springdf.at[row, 'Allocation'] = q + 1
q = springdf.at[row, 'Allocation']
您的错误消息规定的替代方法是:
df.at[]
我自己还没有测试过,但是我觉得第二种选择是更快的性能。
编辑:我刚刚对其进行了测试,第二个选项(使用{{1}})的速度是10列乘2列随机数DataFrame的速度提高了1000倍(10.1毫秒对14.2秒钟)。