cumsum() 在多个列上

cumsum() over several columns

我想创建以下数据框:

Index       A        B        C
 a          0        0        0
 b          1       10        0
 c         -1        0      -10
 d          1       20        0
 e          0        0        0
 f         -1        0      -20
 g          0        0        0
 h          1       15        0
 i         -1        0      -15

AB 给出。 C 应通过函数生成,无需迭代。可能以这种方式:

def generate_C():
    C = np.where(A == -1, << here prior value from B * -1 >>, 0)
    df['C] = C
    return df

我尝试通过 cumsum() 对 BC 列进行操作,但效果并不理想。有什么建议吗?

尝试:

df.C = (df.B.replace(0, np.nan).ffill().shift() * (df.A == -1) * -1).fillna(0)

确认jezrael的建议:

df.C = (df.B.replace(0, np.nan).ffill() * (df.A == -1) * -1).fillna(0)

同样有效。由于我们是前向填充,因此没有必要进行转移。

确认博维尔上校的建议:

df.C = np.where(df.A==-1, -df.B.replace(0, method='ffill').shift(), 0)

也有效,如果它作为答案发布并且实际上是我的选择,我将投票作为选择的答案。

numpy 中很容易做到,但我还没有找到一种方法来直接在 pandas 中做到这一点,因为显然 pandas 不知何故忽略了幻想索引:

def generate_C(df, inplace=False):
    import numpy

    if not inplace:
        df = df.copy()

    A, B = df.values.T
    C = numpy.zeros_like(A)
    C[A==-1] = -B[A==1]
    df['C'] = C

    return df

编辑:

我找到了一种使用纯 pandas:

的方法
def generate_C(df, inplace=False):
    if not inplace:
        df = df.copy()

    df['C'] = (-df.B[df.A==1]).reindex(df.A[df.A==-1].index,method='pad')
    df['C'].fillna(0, inplace=True)

    return df

您可以使用:

df.loc[df.A==-1, 'C'] = (-df.loc[df.A==1, 'B']).values
df.C.fillna(0, inplace=True)
print (df)
       A   B    C   
Index                 
a      0   0   0.0
b      1  10   0.0
c     -1   0 -10.0
d      1  20   0.0
e      0   0   0.0
f     -1   0 -20.0