我有美元化的数据帧:
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列到第2列之间的列与"0"上出现的数字相加;天",例如,
对于第1行,我将合计3天->0+5+2
第2行为108天,第3行为
5天->0+4+2+1+0
我怎么能做这样的事?寻找方法。
对于矢量化解决方案,首先按位置过滤行,然后通过比较numpy Boradasting中的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