Wie ersetze man Werte in einem Bereich in einem Pandas-Dataframe mit einem anderen Wert in demselben Dataframe basierend auf einer Bedingung

Ich möchte Werte innerhalb eines Bereichs von Spalten in einem Dataframe mit einem entsprechenden Wert in einer anderen Spalte ersetzen, wenn der Wert im Bereich größer als Null ist.

Ich würde denken, dass ein einfacher Ersatz wie folgt funktionieren würde:

  • Python ConfigParser Interpolation aus dem ausländischen Bereich
  • Zuordnen innerhalb if-Anweisung Python
  • NZEC-Fehler in Python
  • Wie lxml xpath-Funktionen in den Standard-Namespace importieren?
  • Output Set und seine Inhalte in Python?
  • Sqlalchemy: alembic bulk insert scheitert: 'str' Objekt hat kein Attribut '_autoincrement_column'
  • df = df.loc[:,'A':'D'].replace(1, df['column_with_value_I_want']) 

    Aber das tut in der Tat nichts so weit wie ich kann sagen, außer fallen die column_with_value_I_want , die völlig unbeabsichtigt ist, und ich bin mir nicht sicher, warum das passiert.

    Das scheint auch nicht zu funktionieren:

     df[df.loc[:,'A':'D']] > 0 = df['column_with_value_I_want'] 

    Es gibt den Fehler zurück: SyntaxError: can't assign to comparison .

    Dies scheint, wie es sollte einfach sein, aber ich bin in einem Verlust nach dem Versuch mehrere verschiedene Dinge ohne Erfolg.

    Das Dataframe, mit dem ich arbeite, sieht so aus:

     df = pd.DataFrame({'A' : [1,0,0,1,0,0], 'B' : [1,0,0,1,0,1], 'C' : [1,0,0,1,0,1], 'D' : [1,0,0,1,0,0], 'column_with_value_I_want' : [22.0,15.0,90.0,10.,None,557.0],}) 

    One Solution collect form web for “Wie ersetze man Werte in einem Bereich in einem Pandas-Dataframe mit einem anderen Wert in demselben Dataframe basierend auf einer Bedingung”

    Nicht sicher, wie es in Pandas per se zu tun, aber es ist nicht so schwer, wenn Sie auf numpy fallen.


    Wenn du Glück hast, dass dein ganzes DataFrame numerisch ist, kannst du das wie folgt tun:

     import numpy as np m = df.as_matrix() >>> pd.DataFrame( np.where(np.logical_or(np.isnan(m), m > 0), np.tile(m[:, [4]], 5), m), columns=df.columns) ABCD column_with_value_I_want 0 22 22 22 22 22 1 0 0 0 0 15 2 0 0 0 0 90 3 10 10 10 10 10 4 0 0 0 0 NaN 5 0 557 557 0 557 

    • as_matrix konvertiert einen DataFrame in ein numpy array .
    • np.where ist numpy 's ternäre bedingte.
    • np.logical_or ist numpy 's oder.
    • np.isnan ist ein Scheck, ob ein Wert nicht nan .
    • np.tile Fliesen (in diesem Fall) eine 2d einzelne Spalte zu einer Matrix.

    Leider wird das oben Gesagte fehlschlagen, wenn einige Ihrer Spalten (auch solche, die nicht an dieser Operation beteiligt sind) inhärent nicht numerisch sind. In diesem Fall können Sie folgendes tun:

     for col in ['A', 'B', 'C', 'D']: df[col] = np.where(df[col] > 0, df[col], df.column_with_value_I_want) 

    Die so lange funktionieren, wie die 5 relevanten Spalten numerisch sind.

    Dies verwendet eine Schleife (die in numerischen Python verpönt ist), aber zumindest tut es so über Spalten und nicht Zeilen. Angenommen, Ihre Daten sind länger als breiter, es sollte OK sein.

    Python ist die beste Programmiersprache der Welt.