我正在通过在同一行中添加列来制作动态表,但是,列的范围是根据两列的差异(高-低)确定的:
df = pd.DataFrame({
'10': [1, 10, 20, 30, 40, 50],
'20': [20, 15, 12, 18, 32, 12],
'30': [3, 11, 25, 32, 13, 4],
'40': [32, 11, 9, 82, 2, 1],
'50': [9, 5, 11, 11, 2, 5],
'low': [12, 22, 18, 27, 23, 15],
'high': [45, 41, 33, 54, 35, 45],
})
df
Index 10 20 30 40 50 low high
0 1 20 3 32 9 12 45
1 10 15 11 11 5 22 41
2 20 12 25 9 11 18 33
3 30 18 32 82 11 27 54
4 40 32 13 2 2 23 35
5 50 12 4 1 5 15 45
然后采用 高和低范围来确定选择了哪些列,最后按索引求和。因此,我的初始代码首先确定列之间的差异,然后查询要用于该操作的{cols
)
def colrange(first, last):
return (first - last).abs().argsort()[0]
cols = df.columns[:-2]
然后我使用iterrows()
开始查看范围之间的每一行:
c = cols.to_series().astype(int)
for idx,row in df.iterrows():
df.loc[idx,'result']= row[cols[ colrange(c,row.low) : colrange(c, row.high) ]].sum()
所以我的df['result']
应该像这样:
Index 10 20 30 40 50 low high result
0 1 20 3 32 9 12 45 1+20+3 = 24
1 10 15 11 11 5 22 41 15+11 = 26
2 20 12 25 9 11 18 33 12 = 12
3 30 18 32 82 11 27 54 32+82 = 114
4 40 32 13 2 2 23 35 32 = 32
5 50 12 4 1 5 15 45 50+12+4 = 66
我的问题是此方法太慢,您能建议其他想法如何解决此问题吗?我先感谢您的想法。
答案 0 :(得分:0)
在您的示例中,这大约快了5倍。 随着DataFrame大小的增加,它的缩放比例也应该很好。
start = np.abs((c.to_frame().to_numpy().T - df['low'].to_frame().to_numpy())).argsort()[:, 0]
stop = np.abs((c.to_frame().to_numpy().T - df['high'].to_frame().to_numpy())).argsort()[:, 0]
df['result'] = [*map(lambda first, last, row: df.iloc[row, first:last].sum(), start, stop, range(len(df)))]