python - 计算百分比变化的循环逻辑
问题描述
我的数据框:
A B C A_Q B_Q C_Q
27 40 41 2 1 etc
28 39 40 1 5
30 28 29 3 6
28 27 28 4 1
15 10 11 5 4
17 13 14 1 5
16 60 17 8 10
14 21 18 9 1
20 34 23 10 2
21 45 34 7 4
我想用 _Q 后缀遍历每一列中的每一行,从 A_Q 开始并执行以下操作:
- 如果 row value = '1',获取 col 'A' 中的对应值
- 将该值分配给一个变量,称之为 x
- 继续循环 col A_Q
- 如果行值是 1,2,3,4,5,6,7,8 或 9,则忽略
- 如果值为 10,则在 col 'A' 中获取相应的值并将其分配给变量 y
- 计算 % 变化,称为 chg,在 y 和 x 之间:(y/x)-1)*100
- 将 chg 附加到数据框
- 按照上面的步骤 1-7 继续往下走,直到结束
然后对其他列 B_Q、C_Q 等执行相同操作
例如,在上面,出现的第一个“1”对应于 col A 中的 28。所以 x = 28。然后继续迭代,忽略值 1 到 9,直到你得到一个 10,它对应于 col A 中的 20 . 计算 % change = ((20/27)-1)*100 = -25.9% 并将其附加到新创建的 col A_S 中的 df 中。然后从该点开始以相同的步骤继续,直到到达文件末尾。最后,对其余列执行相同操作。
那么df看起来像:
A B C A_Q B_Q C_Q A_S B_S C_S etc
27 40 41 2 1 etc
28 39 40 1 5
30 28 29 3 6
28 27 28 4 1
15 10 11 5 4
17 13 14 1 5
16 60 17 8 10 50
14 21 18 9 1
20 34 23 10 2 -25.9
21 45 34 7 4
我想创建一个函数,然后做类似的事情,df ['_S'] = df.apply ( function, axis =1)
但我坚持执行上述步骤 1-8。谢谢!
解决方案
您是否需要将结果附加为新列?您最终将得到几乎为空的列,其中只有一个数据值。您能否将所有结果附加到“_Q”列的底部?无论如何,这是我对完成您所要求的所有功能的尝试:
def func(col1, col2):
l = []
x = None
for index in range(0, len(col1)):
if x is None and col1[index] == 1:
x = col2[index]
l.append(0)
elif not(x is None) and col1[index] == 10:
y = col2[index]
l.append(((float(y)/x)-1)*100)
x = None
else:
l.append(0)
return l
然后你将这个函数 A_Q 作为 col1 和 A 作为 col2 传递,它应该返回你想要的。对于传递函数,假设每个 A、B、C 列都有一个关联的 _Q 列,您可以执行以下操作:
q = [col for col in df.columns if '_Q' in col]
for col in q:
df[col[:len(col) - 2] + '_S] = func(df[col], df[col[:len(col) - 2]
推荐阅读
- swift - SpriteKit (Swift) 中的地图创建
- python - 我无法在 Mac 上同时安装 Portaudio 和 pyaudio
- javascript - JavaScript 小数位是如何定义的?
- wix - 显示自定义错误,而不是“MainEngineThread 正在返回 1624”的 WiX 默认错误
- java - 我需要 import java.nio.charset.StandardCharsets(1.6); 对于 Java 1.5
- audio - 用 HTML5 录制音频,声音往往会发出咔嗒声,比如它会很快停止点击
- java - 是否有必要开始事务以在数据库中查找对象?
- visual-studio - Visual Studio 2019 - 无法更改配置文件设置,而是打开 FolderProfile.pubxml
- php - 通过 ACF 复选框值过滤 WooCommerce 产品的 URL 查询?
- c# - Automapper 升级问题...类型中不存在