2017-01-31 2 views
1

Ich habe ein Datenframe (df) mit 10 Spalten. Der Index hat viele verschiedene Daten, aber es gibt mehrere identische Daten (und es ist nach Datum sortiert). Außerdem sind die wichtigen Spalten für dieses Problem df ['Weight'] und df ['Test'].Erstellen einer neuen Spalte basierend auf dem Anpassen von Gewichten aus anderen Spalten

Hier ist ein Beispiel der Daten mit 2 Spalten für nur 1 Indexwert (2017.01.21), in Wirklichkeit gibt es mehrere Daten mit mehreren Gewichten usw.

  Weight Test 
1/21/2017 0.1  NaN 
1/21/2017 0.04 0.04 
1/21/2017 0.03 Nan 
1/21/2017 0.02 Nan 
1/21/2017 0.2  0.2 
1/21/2017 0.001 Nan 
1/21/2017 0.1  0.1 
1/21/2017 0.21 0.21 
1/21/2017 0.003 Nan 
1/21/2017 0.01 0.01 
1/21/2017 0.04 0.04 
1/21/2017 0.005 Nan 
1/21/2017 0.05 0.05 
1/21/2017 0.1  Nan 
1/21/2017 0.091 Nan 

Die df [ 'Gewicht '] addiert sich für einen bestimmten Index zu 1, und dies gilt für jedes eindeutige Datum des Indexes.

Ich habe eine Testspalte erstellt, die nur ein Gewicht anzeigt, wenn eine Bedingung erfüllt ist.

Jetzt versuche ich eine Spalte df ['adjusted Weight'] zu erstellen, die die Testspalte betrachten wird und wenn es ein Nan gibt, würde es das Gewicht, das in df ['Weight'] ist, mit 0.75 multiplizieren und das zuweisen bis df ['adjusted_weight'], und dann der Rest der Einträge, bei denen df ['Test'] für ein bestimmtes Datum nicht nan ist, sollten die df ['Test'] - Gewichte anteilig nach oben angepasst und df ['zugewiesen werden. berichtigtes Gewicht '] also die Summe von df [' berichtigtes Gewicht '] für jedes Datum = 1.

Ich würde es flexibel sein möchte, damit ich auch die Gewichte von 0,5 bis 0,75 und pro rata für den Rest usw.

Dank alle für die Hilfe und Unterstützung so viel getan vermehren können.

Mit freundlichen Grüßen.

+0

Ich verstehe nicht, Ihre math. 'df.Test.sum() * 2 == 1.30' Wollen Sie also negative Einträge für die Zeilen haben, in denen' Test NaN' ist? – MaxU

+0

Entschuldigung, mein Fehler. Ich möchte eigentlich die Gewichte in Gewicht * 0,75 und dann die Testgewichte nach oben anpassen. Habe die Frage behoben. – MysterioProgrammer91

+0

Es würde helfen, die gewünschte Ausgabe zu sehen. – Parfait

Antwort

1
def bool_scale(df, col, cond, scale): 
    cond = df[cond].notnull().values 
    v = df.values 
    i = df.columns.get_loc(col) 
    w = v[:, i] 
    w_up = w[cond].sum() 
    return df.assign(
     adjusted_weight=np.where(
      cond, w * scale, w/(1 - w_up) * (1 - scale * w_up))) 

bool_scale(df, 'Weight', 'Test', .75) 

      Weight Test adjusted_weight 
1/21/2017 0.100 NaN   0.146429 
1/21/2017 0.040 0.04   0.030000 
1/21/2017 0.030 NaN   0.043929 
1/21/2017 0.020 NaN   0.029286 
1/21/2017 0.200 0.20   0.150000 
1/21/2017 0.001 NaN   0.001464 
1/21/2017 0.100 0.10   0.075000 
1/21/2017 0.210 0.21   0.157500 
1/21/2017 0.003 NaN   0.004393 
1/21/2017 0.010 0.01   0.007500 
1/21/2017 0.040 0.04   0.030000 
1/21/2017 0.005 NaN   0.007321 
1/21/2017 0.050 0.05   0.037500 
1/21/2017 0.100 NaN   0.146429 
1/21/2017 0.091 NaN   0.133250 

können Sie wenden es in einem groupby

kws = dict(col='Weight', cond='Test', scale=.75) 
df.groupby(level=0).apply(bool_scale, **kws) 

        Weight Test adjusted_weight 
1/21/2017 1/21/2017 0.100 NaN   0.146429 
      1/21/2017 0.040 0.04   0.030000 
      1/21/2017 0.030 NaN   0.043929 
      1/21/2017 0.020 NaN   0.029286 
      1/21/2017 0.200 0.20   0.150000 
      1/21/2017 0.001 NaN   0.001464 
      1/21/2017 0.100 0.10   0.075000 
      1/21/2017 0.210 0.21   0.157500 
      1/21/2017 0.003 NaN   0.004393 
      1/21/2017 0.010 0.01   0.007500 
      1/21/2017 0.040 0.04   0.030000 
      1/21/2017 0.005 NaN   0.007321 
      1/21/2017 0.050 0.05   0.037500 
      1/21/2017 0.100 NaN   0.146429 
      1/21/2017 0.091 NaN   0.133250 
+0

Schätzen Sie den Kommentar, ja, ich habe die Mathematik durcheinander gebracht. Im Wesentlichen wollte ich die Gewichte vergrößern, wann immer Test Werte hatte. Ich habe die Frage geändert, um die richtige Logik zu geben. Vielen Dank. – MysterioProgrammer91

+0

@ MysterioProgrammer91 behoben, um Ihre Änderungen zu reflektieren – piRSquared

Verwandte Themen