【问题标题】:Pandas: Conditional cumsum based on previous row value of another columnPandas:基于另一列的前一行值的条件累积和
【发布时间】:2020-07-03 17:38:28
【问题描述】:

我想对一列进行求和,但求和前每一行的值必须与另一列的值进行检查,如果另一列的值较小,则该值相加而不是第一列的前一行.考虑这个数据框:

df = pd.DataFrame({'X': [0,1,0,1,1,0,0,0,0,1,1,1,0,1], 'Y': [0, 0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 5, 5]})
    X   Y
0   0   0
1   1   0
2   0   1
3   1   1
4   1   1
5   0   2
6   0   3
7   0   4
8   0   4
9   1   4
10  1   4
11  1   4
12  0   5
13  1   5

现在,我想对 X 求和,但是如果 Y 小于上一行中的 X,它会加起来而不是 X。例如,X 的第二行的 cumsum 结果是 1 但因为第二行是 0 Y的行小于1,我们替换它。那么第三行的 cumsum 将是 0 而不是 1。 我使用“for循环”编写代码如下,但对于大型数据集它根本没有效率:

df['Z'] = 0
for index in range(1,len(df)):
    df.loc[index, 'Z'] = min(df.loc[index, 'X']+df.loc[index-1, 'Z'], df.loc[index, 'Y'])

Z 的预期结果是:

    X   Y   Z
0   0   0   0
1   1   0   0
2   0   1   0
3   1   1   1
4   1   1   1
5   0   2   1
6   0   3   1
7   0   4   1
8   0   4   1
9   1   4   2
10  1   4   3
11  1   4   4
12  0   5   4
13  1   5   5

如果有人能提出更有效的方法,我将不胜感激。

【问题讨论】:

    标签: python pandas conditional-statements cumsum


    【解决方案1】:

    由于您的“专业 cumsum”结果取决于之前的结果, 你不能使用实际的 cumsum 函数。

    相反,您应该使用“带内存”的函数(记住 上一个返回值)并在下一次调用中使用它(对于 下一行)。

    0 在这里是一个特例。因为对于第 0 行没有先前的 Z 列的值,即使在您的代码中,您也将结果留给 第一行为 0,所以我在函数中做了同样的事情(见下文)。

    其他行根据您的算法计算。

    要计算您的“专业 cumsum”,请定义以下函数:

    def myCumSum(row):
        if row.name == 0:
            myCumSum.prev = 0
        else:
            myCumSum.prev = min(row.X + myCumSum.prev, row.Y)
        return myCumSum.prev
    

    关于row.name的一点解释:其实就是 当前行和我的解决方案依赖于源 DataFrame 具有默认索引,即从 0 开始的连续数字。

    然后将其应用于每一行并将结果保存在新列中(Z):

    df['Z'] = df.apply(myCumSum, axis=1)
    

    结果是:

        X  Y  Z
    0   0  0  0
    1   1  0  0
    2   0  1  0
    3   1  1  1
    4   1  1  1
    5   0  2  1
    6   0  3  1
    7   0  4  1
    8   0  4  1
    9   1  4  2
    10  1  4  3
    11  1  4  4
    12  0  5  4
    13  1  5  5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多