cumsum()遍历多个列

时间:2016-06-03 06:54:10

标签: python pandas dataframe cumsum

我想创建以下数据框:

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

ABC将通过函数生成,无需迭代。可能就是这种方式:

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

我通过cumsum()尝试了B列和C列但未达到目标。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您可以使用:

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

答案 1 :(得分:3)

尝试:

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

确认了以色列的建议:

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

同样适用。由于我们正在前进,所以转变变得没必要了。

确认了ColonelBeauvel的建议:

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

如果作为答案发布并且实际上是我的选择,也可以作为我选择的答案。

答案 2 :(得分:2)

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