cumSum () over meerdere kolommen

stemmen
3

Ik wil de volgende dataframe te maken:

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

Aen Bworden gegeven. Cgeschiedt via een functie en zonder iteratie worden gegenereerd. Misschien op deze manier:

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

Ik probeerde via cumSum () over kolommen Ben Cmaar niet ver komen. Eventuele suggesties alstublieft?

De vraag is gesteld op 03/06/2016 om 05:54
user
In andere talen...                            


3 antwoorden

stemmen
3

Proberen:

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

bevestigd jezrael suggestie:

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

werkt net zo goed. Aangezien wij naar voren vullen, werd de verschuiving overbodig.

bevestigd ColonelBeauvel suggestie:

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

Ook werkt en zou mijn stem als het antwoord van de keuze had geplaatst als een antwoord en eigenlijk mijn keuze.

antwoordde op 03/06/2016 om 06:07
bron van user

stemmen
2

Het is gemakkelijk om te doen in numpy, maar ik heb nog een manier vinden om een manier om het rechtstreeks in te doen vinden vinden pandas, want blijkbaar pandaseen of andere manier negeert de fancy indexering:

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

BEWERK:

Ik vond een manier om het aan met pure 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
antwoordde op 03/06/2016 om 06:37
bron van user

stemmen
5

Je kunt gebruiken:

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
antwoordde op 03/06/2016 om 07:00
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more