Pandas 对每行的特定列数求和

Sum specific number of columns for each row with Pandas

我有以下数据框:

   name  code     1   2  3  4  5  6  7 .........155    days
0  Lari  EH214    0   5  2  1  0  0  0           0      3
1  Suzi  FK362    0   0  0  0  2  3  0           0      108
2  Jil   LM121    0   0  4  2  1  0  0           0      5
...

我想将第 1 列与第 1 列之间的列与“天”上出现的数字相加,例如,
对于第 1 行,我将 总结 3 天-> 0+5+2
对于第 2 行 108 天,
第 3 行 5 天->0+4+2+1+0

我怎样才能做这样的事情? 求方法。

对于向量化解决方案,首先按位置过滤行,然后通过在 numpy boroadasting 中比较 days 获取掩码,如果不匹配,则替换 DataFrame.where 中的 0 和最后一个 sum

df1 = df.iloc[:, 2:-1]

m = df1.columns.astype(int).to_numpy() <= df['days'].to_numpy()[:, None]

df['sum'] = df1.where(m, 0).sum(axis=1)
print (df)
   name   code  1  2  3  4  5  6  7  155  days  sum
0  Lari  EH214  0  5  2  1  0  0  0    0     3    7
1  Suzi  FK362  0  0  0  0  2  3  0    0   108    5
2   Jil  LM121  0  0  4  2  1  0  0    0     5    7

IIUC,使用:

df['sum'] = df.apply(lambda r: r.loc[1: r['days']].sum(), axis=1)

或者,如果列名是字符串:

df['sum'] = df.apply(lambda r: r.loc['1': str(r['days'])].sum(), axis=1)

输出:

   name   code  1  2  3  4  5  6  7  155  days  sum
0  Lari  EH214  0  5  2  1  0  0  0    0     3    7
1  Suzi  FK362  0  0  0  0  2  3  0    0   108    5
2   Jil  LM121  0  0  4  2  1  0  0    0     5    7