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
我有以下数据框:
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