如何根据计数器应用多个条件,并使用 pandas 和 python 在 excel 中为每个条件提供输出?

Posted

技术标签:

【中文标题】如何根据计数器应用多个条件,并使用 pandas 和 python 在 excel 中为每个条件提供输出?【英文标题】:how to apply multiple conditions according to the counter and give output for each condition in excel using pandas and python? 【发布时间】:2020-04-10 01:15:04 【问题描述】:

给定输入表:

schedule actual dev count rate
1235     1233   -2         235
1236     1222   -14        235
1255     1113   -142       235
1244     1242   -2         235
1239     1212   -27        235
1856     1500   -356       235
1356     1220   -136   1   235
1478     1520    42        235
1563     1623    60        235
1235     1350    115       235
1294     1432    138       235
1278     1650    372       235
1913     2000    87        235
1650     1750    100    2  235

在此表中有 4 列 dev 代表偏差,这只是“实际”和“计划”列之间的差异。接下来我们有一个“count”列,其中数字在每 7 个连续的 -(ve) 或 + (ve) dev 后递增,最后我们有一个“rate”列

现在,我的目标是只计算增加的​​计数器值的惩罚,并将零放在其他地方,我真的想知道我在哪里犯了错误,我不希望这些值采用 excel 格式,我需要那些列表或数组形式的值。这样我就可以进一步使用它们。

我的尝试:

counts = df['count'].values.tolist()
devs = df['dev'].values.tolist()
rates = df['rate'].values.tolist()
sustained = []

for i, j, k in zip(counts, devs, rates):
    if j > 0:  #when dev is positve
        if 5>= i > 0:  #when number of counts are between 1 to 5
            sus = abs(j) * k * 0.075
            sustained.append(sus)
        else:
            sustained.append(0)

        if 10>= i > 5:   #when number of counts are between 6 to 10 
            sus = abs(j) * k * 0.125
            sustained.append(sus)
        else:
            sustained.append(0)

        if i > 10:  #when number of counts are above 10
            sus = abs(j) * k * 0.25
            sustained.append(sus)
        else:
            sustained.append(0)

    else:    #when dev is negative
        if 5 >= i > 0: #when number of counts are between 1 to 5
            sus = abs(j) * k * 0.075
            sustained.append(sus)
        else:
            sustained.append(0)

        if 10 >= i > 5 and j < 0: #when number of counts are between 5 to 10
            sus = abs(j) * k * 0.125
            sustained.append(sus)
        else:
            sustained.append(0)

        if 10>= i > 5: #when number of counts are above 10
            sus = abs(j) * k * 0.2
            sustained.append(sus)
        else:
            sustained.append(0)

#df['penalty'] = pd.Series(sustained)
#df

print("count:", counts) print("持续惩罚:",sustained) #sustained代表惩罚

输出:

("count: ", , , , , , , 1, , , , , , , 2)
("sustained penalties: ", 0,0,0,0,0,0,0,0,0,0,0,0,0)

想要的输出:

    count: 0,0,0,0,0,0,1,0,0,0,0,0,0,2
sustained penalties: 0,0,0,0,0,0,2397,0,0,0,0,0,0,1762.5

我需要列表或数组形式的惩罚值,以便我可以将它们用于进一步使用,这就是为什么我注释掉 pandas 的代码来计算这些值。

【问题讨论】:

【参考方案1】:

IIUC,你可以这样做:

s = (pd.cut(df['count'], 
           bins=[0,5,10,np.inf], 
           labels=[0.075, 0.125, 0.25])
      .astype(float)
      .fillna(0)
    )

df['penalty'] = s * df['rate'] * df['dev'].abs()

输出:

    schedule  actual  dev  count  rate  penalty
0       1235    1233   -2    NaN   235      0.0
1       1236    1222  -14    NaN   235      0.0
2       1255    1113 -142    NaN   235      0.0
3       1244    1242   -2    NaN   235      0.0
4       1239    1212  -27    NaN   235      0.0
5       1856    1500 -356    NaN   235      0.0
6       1356    1220 -136    1.0   235   2397.0
7       1478    1520   42    NaN   235      0.0
8       1563    1623   60    NaN   235      0.0
9       1235    1350  115    NaN   235      0.0
10      1294    1432  138    NaN   235      0.0
11      1278    1650  372    NaN   235      0.0
12      1913    2000   87    NaN   235      0.0
13      1650    1750  100    2.0   235   1762.5

【讨论】:

很抱歉,现在我编辑了我的问题。实际上,我需要列表或数组中的这些惩罚值,以便我可以进一步使用它们。请你告诉我我在代码中哪里出错了,我真的很想应用这些条件来计算这些惩罚。

以上是关于如何根据计数器应用多个条件,并使用 pandas 和 python 在 excel 中为每个条件提供输出?的主要内容,如果未能解决你的问题,请参考以下文章

pandas根据列数据的值范围计数?

如何使用具有多个连接的 SQL 查询并使用休眠计数

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

如何在 python/pandas 中使用 where 条件转换 sql 计数?

如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?

Pandas:根据不同类型的多个条件更改值