- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个试图从 Excel 电子表格复制的数据框。它有一个值列表,在最后一列中,公式应该是如果 RunningTotal = Max 那么该值应该是 0。如果 Max 等于 max.shift(1) 那么该值应该是 Diff 的最小值列和 MaxDraw 列的前一个值。
list = [-350, 1350, 300, 300, -500, -100, -550, 1450,
-3900, -1150, 4150, -1900, 1700, 7750, -3050, -1450, -1850, 4250]
df = pd.DataFrame(data=list, columns=['Values'])
df['RunningTotal'] = df['Values'].cumsum()
df['Max'] = df['RunningTotal'].cummax()
df['Diff'] = df['RunningTotal']-df['Max']
df['MaxDraw'] = np.where(df['RunningTotal'] == df['Max'], 0,
np.where(df['Max'] == df['Max'].shift(1),
**np.minimum(df['MaxDraw'].shift(1)**, df['Max']), np.nan))
双星代码片段是我尝试过的,但它看起来无法引用我正在定义的行中的值。我试过做一个临时列,但我需要以前的值才能得到最终结果。
预期结果应与下面的 MaxDraw 列匹配。
Vales Running Total Max MaxDraw
-350 -350 NA NA
1350 1000 1000 0
300 1300 1300 0
300 1600 1600 0
-500 1100 1600 -500
-100 1000 1600 -600
-550 450 1600 -1150
1450 1900 1900 0
-3900 -2000 1900 -3900
-1150 -3150 1900 -5050
4150 1000 1900 -5050
-1900 -900 1900 -5050
1700 800 1900 -5050
7750 8550 8550 0
-3050 5500 8550 -3050
-1450 4050 8550 -4500
-1850 2200 8550 -6350
4250 6450 8550 -6350
D3 中的 excel 公式是=IF(A3="","",IF(C3=B3,0,IF(C3=C2,MIN(B3-C3,D2))))
任何帮助将不胜感激,因为我已经为此苦苦思索了很长一段时间!
编辑:
在尝试保持此矢量化且不必使用迭代时 - 如果最大列不等于最大列的前一行,是否有一个解决方案可以利用 np.where 并说值为 0 -否则返回差异列的运行最小值,直到最大列再次更改?
最佳答案
您需要在此处使用显式 for 循环:
m = []
for i in df.index:
if df.iloc[i,1]==df.iloc[i,2]:
m.append(df.iloc[i,3])
else:
m.append(min(m[i-1],df.iloc[i,3]))
df["MAXDRAW"]=m
df
Values RunningTotal Max Diff MAXDRAW
0 -350 -350 -350 0 0
1 1350 1000 1000 0 0
2 300 1300 1300 0 0
3 300 1600 1600 0 0
4 -500 1100 1600 -500 -500
5 -100 1000 1600 -600 -600
6 -550 450 1600 -1150 -1150
7 1450 1900 1900 0 0
8 -3900 -2000 1900 -3900 -3900
9 -1150 -3150 1900 -5050 -5050
10 4150 1000 1900 -900 -5050
11 -1900 -900 1900 -2800 -5050
12 1700 800 1900 -1100 -5050
13 7750 8550 8550 0 0
14 -3050 5500 8550 -3050 -3050
15 -1450 4050 8550 -4500 -4500
16 -1850 2200 8550 -6350 -6350
17 4250 6450 8550 -2100 -6350
如果你需要一个函数,那么可以使用 itertools.accumulate
。
list(itertools.accumulate([df.iloc[0,3]]+df.iloc[1:].values.tolist(),lambda x,y:y[3] if y[1]==y[2] else min(x,y[3])))
这也和functools.reduce
有关
functools.reduce(lambda x,y:x+[y[3]]if y[1]==y[2] else x+[min(x[-1],y[3])],df.iloc[1:].values.tolist(),[df.iloc[0,3]])
关于python - 执行引用同一列中先前值的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51599191/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!