我正在尝试对以下每列的行值求和,如果它们的"日期";值低于列名的值:
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