如何根据计数器应用多个条件,并使用 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 中为每个条件提供输出?的主要内容,如果未能解决你的问题,请参考以下文章
如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧
如何在 python/pandas 中使用 where 条件转换 sql 计数?