如果列名高于行值,则求和



我正在尝试对以下每列的行值求和,如果它们的"日期";值低于列名的值:

01-01-2020     01-01-2021     01-01-2022           date
1          1              3              6     01-01-2020
2          4              4              2     01-10-2021
3          5              1              9     01-12-2021

例如,对于第1列,唯一日期值等于或低于第1列名称(01-01-2020(的行是第一行,因此第1列的总和为1。

同样地,由于";日期";列低于最后一列的名称(01-01-2022(,总数为6+2+9=17,这将导致以下结果:

01-01-2020     01-01-2021     01-01-2022           date
1              1              3              6     01-01-2020
2              4              4              2     01-10-2021
3              5              1              9     01-12-2021
Total          1              3             17

有没有比在每一列然后每一行上循环更优雅的方法呢?

我们可以使用np.greater_equal.outer进行检查,然后将列掩码中不需要的单元格切片,布尔输出为NaN

s = pd.to_datetime(df.date).values
m = np.greater_equal.outer(pd.to_datetime(df.columns[:-1]).values,s).T
df = df.append(df.iloc[:,:-1].where(m).sum().to_frame('Total').T)
df
Out[381]: 
01-01-2020  01-01-2021  01-01-2022        date
1             1.0         3.0         6.0  01-01-2020
2             4.0         4.0         2.0  01-10-2021
3             5.0         1.0         9.0  01-12-2021
Total         1.0         3.0        17.0         NaN

最新更新