PYTHON:连续遍历行,并根据行中的值更改值,直到满足条件

时间:2019-07-30 15:35:54

标签: python pandas iteration overriding

我有一个数据框架,其中包含人员配备值(上限)和分配的行。

我需要重复遍历每一行,直到我的分配达到我的人手价值为止。我的分配从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文件中。

感谢您的帮助!

1 个答案:

答案 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秒钟)。