Python: Numpy / Pandas ändern ihre Werte unter bestimmten Bedingungen

Ich würde gerne wissen, ob es eine schnellere und "pythonischere" Methode gibt, um Folgendes zu tun, z. mit einigen eingebauten Methoden. Wenn ein Pandas-DataFrame oder ein numpy-Array von Gleitkommazahlen gegeben ist und der Wert gleich oder kleiner als 0,5 ist, muss ich den reziproken Wert berechnen und mit -1 multiplizieren und den alten Wert durch den neu berechneten ersetzen. "Transformieren" ist wahrscheinlich eine schlechte Wortwahl. Sagen Sie mir bitte, ob Sie eine bessere / genauere Beschreibung haben.

Vielen Dank für Ihre Hilfe und Unterstützung!

Daten:

import numpy as np
import pandas as pd
dicti = {"A" : np.arange(0.0, 3, 0.1), 
         "B" : np.arange(0, 30, 1),
         "C" : list("ELVISLIVES")*3}
df = pd.DataFrame(dicti)

meine Funktion:

def transform_colname(df, colname):
    series = df[colname]    
    newval_list = []
    for val in series:
        if val <= 0.5:
            newval = (1/val)*-1
            newval_list.append(newval)
        else:
            newval_list.append(val)
    df[colname] = newval_list
    return df

Funktionsaufruf:

transform_colname(df, colname="A")

** -> Ich fasse die Ergebnisse hier zusammen, da Kommentare keine Postleitzahl zulassen (oder ich weiß nicht, wie es geht). **

Vielen Dank für Ihre schnellen und tollen Antworten!

mit ipython "% timeit" mit "echten" daten:

meine Funktion: 10 Schleifen, am besten 3: 24,1 ms pro Schleife

von jojo:

def transform_colname_v2(df, colname):
    series = df[colname]        
    df[colname] = np.where(series <= 0.5, 1/series*-1, series)
    return df

100 Schleifen, am besten 3: 2,76 ms pro Schleife

von FooBar:

def transform_colname_v3(df, colname):
    df.loc[df[colname] <= 0.5, colname]  = - 1 / df[colname][df[colname] <= 0.5]
    return df

100 Schleifen, am besten 3: 3,32 ms pro Schleife

von dmvianna:

def transform_colname_v4(df, colname):
    df[colname] = df[colname].where(df[colname] <= 0.5, (1/df[colname])*-1)
    return df

100 Schleifen, am besten 3: 3,7 ms pro Schleife

Bitte sagen / zeigen Sie mir, ob Sie Ihren Code anders implementieren würden!

Eine letzte FRAGE: (beantwortet) Wie könnten die Versionen von "FooBar" und "dmvianna" "generisch" gemacht werden? Ich meine, ich musste den Namen der Spalte in die Funktion schreiben (da die Verwendung als Variable nicht funktionierte). Bitte erläutern Sie diesen letzten Punkt! -> danke jojo, ".loc" ist nicht der richtige weg, aber sehr einfach df [colname] ist ausreichend. Die oben genannten Funktionen wurden geändert, um "generischer" zu werden. (Außerdem wurde ">" in "<=" geändert und das Timing aktualisiert.)

Vielen Dank!!

Antworten auf die Frage(3)

Ihre Antwort auf die Frage