动态范围内的列总和

时间:2020-10-04 19:48:46

标签: python pandas

我正在通过在同一行中添加列来制作动态表,但是,列的范围是根据两列的差异(高-低)确定的:

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

我的问题是此方法太慢,您能建议其他想法如何解决此问题吗?我先感谢您的想法。

1 个答案:

答案 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)))]