- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的数据框是这样的:
scale cons hold supply add.supply s_res z_res
48 -5 NaN NaN NaN NaN NaN NaN
49 -4 NaN NaN NaN NaN NaN NaN
50 -3 NaN NaN NaN NaN NaN NaN
51 -2 NaN NaN NaN NaN NaN NaN
52 -1 NaN NaN NaN NaN NaN NaN
53 0 0 300 0 NaN 100 200
54 1 20 NaN 0 NaN 200 322
55 2 30 NaN 70 NaN 100 100
56 3 25 NaN 0 NaN 400 110
57 4 15 NaN 0 NaN 100 300
58 5 10 NaN 0 NaN 100 180
59 6 40 NaN 0 NaN 100 100
...
我需要做以下事情:
从scale = 1
的值开始填写专栏 hold
值计算如下:
我在 hold
列中取前一个值并从 cons
列中减去当前单元格的相应值并从 supply
列中添加相应的值.
(对于 hold
列中对应于 scale = 1
的单元格,它将是 (300 - 20) + 0 = 280
,对于下一个单元格 (280 - 30) + 70) = 320
, 对于下一个单元格 (320 - 25) + 0) = 295
等等)
如果列中的值hold
小于s_res
列中的对应值, 然后到下一个单元格我必须添加列中相应的下一个单元格值之间的差异 s_res
和 z_res
.
例如hold
列中的值是295
, 其中scale = 3
.该值小于 s_res = 400
列中的值.然后我需要计算下一个值:(295 - 15) + 0 + (300 - 100) = 480
.并写下 s_res
之间的差异和 z_res
在 add.supply
栏中.
我需要列中的每个新计算值 hold
检查是否小于s_res
列中的值.
结果应该是这样的:
scale cons hold supply add.supply s_res z_res
48 -5 NaN NaN NaN NaN NaN NaN
49 -4 NaN NaN NaN NaN NaN NaN
50 -3 NaN NaN NaN NaN NaN NaN
51 -2 NaN NaN NaN NaN NaN NaN
52 -1 NaN NaN NaN NaN NaN NaN
53 0 0 300 0 NaN 100 200
54 1 20 280 0 NaN 200 322
55 2 30 320 70 NaN 100 100
56 3 25 295 0 NaN 400 110
57 4 15 480 0 200 100 300
58 5 10 470 0 NaN 100 180
59 6 40 430 0 NaN 100 100
...
如有任何建议,我将不胜感激。
UPD 我尝试应用代码
df['hold'] = df.hold.fillna(method='ffill') - df.cons.cumsum() + df.supply.cumsum()
df['add.supply'] = np.where(df.hold.shift() < df.s_res.shift(), df.z_res - df.s_res, np.nan)
df['hold'] = df.hold + df['add.supply'].fillna(0).cumsum()
到一个更大的数据框,我遇到了问题
我的新数据框
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 NaN 0 NaN 200 322
2 2 30 NaN 70 NaN 100 100
3 3 25 NaN 0 NaN 400 110
4 4 15 NaN 0 NaN 100 300
5 5 10 NaN 0 NaN 100 180
6 6 40 NaN 0 NaN 100 100
7 7 60 NaN 0 NaN 300 400
8 8 50 NaN 0 NaN 245 300
9 9 70 NaN 0 NaN 300 600
10 10 50 NaN 0 NaN 143 228
...
结果应该是这样的:
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 280 0 NaN 200 322
2 2 30 320 70 NaN 100 100
3 3 25 295 0 NaN 400 110
4 4 15 480 0 200 100 300
5 5 10 470 0 NaN 100 180
6 6 40 430 0 NaN 100 100
7 7 60 370 0 NaN 300 400
8 8 50 320 0 NaN 245 300
9 9 70 250 0 NaN 300 600
10 10 50 285 0 85 143 228
...
但是代码执行的结果不是应该的:
scale cons hold supply add.supply s_res z_res
0 0 0 300 0 NaN 100 200
1 1 20 280 0 NaN 200 322
2 2 30 320 70 NaN 100 100
3 3 25 295 0 NaN 400 110
4 4 15 480 0 200 100 300
5 5 10 470 0 NaN 100 180
6 6 40 430 0 NaN 100 100
7 7 60 370 0 NaN 300 400
8 8 50 375 0 55 245 300
9 9 70 605 0 300 300 600
10 10 50 640 0 85 143 228
...
错误出现在hold = 370
之后,但我不明白为什么。
最佳答案
您可以使用 cumsum()
的组合,而不是逐行执行此操作和 np.where
在整个 DataFrame 中执行此操作:
df['hold'] = df.hold.fillna(method='ffill') - df.cons.cumsum() + df.supply.cumsum()
df['add.supply'] = np.where(df.hold.shift() < df.s_res.shift(), df.z_res - df.s_res, np.nan)
df['hold'] = df.hold + df['add.supply'].fillna(0).cumsum()
考虑您要分两个阶段进行的转换。您有一个初始阶段,您在该阶段对 df.hold
的初始值进行加减。然后,在某些情况下,您将根据某些条件更改 hold 的新值。
cumsum()
采用 Series 或 DataFrame 并制作一个新版本,其中每一行都是前几行和当前行的累积和。您可以为 df.cons
和 df.supply
执行此操作,以获得将从 df.hold
中减去和添加的累计金额。现在您已计算出 df.hold
的第一阶段。
您可以使用np.where
找出df.hold
何时满足您感兴趣的条件。它在哪里,您可以设置df ['add.supply']
相应地。然后您可以将这个新列添加到 df.hold
。请注意,我们正在使用 fillna(0)
来确保每一行都有一个值,并再次使用 cumsum()
来随着时间的推移保留添加的条件值。
更新
上面的原代码在add.supply
加了一个值后就失效了,因为df.hold
第一阶段的future值没有包括它。可能有一种方法可以非迭代地执行此操作,并且肯定有一种比我在下面所做的方法更好更简洁的方法,但这至少可以完成工作:
df['hold'] = df.hold.fillna(method='ffill') - df.cons.cumsum() + df.supply.cumsum()
hold = df.hold.tolist()
s_res = df.s_res.tolist()
add = (df.z_res - df.s_res).shift(-1).tolist()
newh = [hold[0]]
totala = 0
for h, s, a in zip(hold, s_res, add):
newh.append(h + totala)
if newh[-1] < s:
totala += a
df['hold'] = pd.Series(newh[1:])
df['add.supply'] = np.where(df.hold.shift() < df.s_res.shift(), df.z_res - df.s_res, np.nan)
关于python - 使用列中的先前值和 pandas 中的一些计算来填充列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45171500/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!