2017-11-19 1 views
0

Mit dem folgenden Beispiel Pandas DataFrame Wie würde ich eine neue Spalte namens "ausgeben" mit Werten, die bedingt auf dem Wert von gefüllt sind eine andere Spalte?Pandas: Wie verwende ich ein Funktionsverzeichnis, um einen Spaltenwert basierend auf Berechnungen zwischen anderen Spalten zuzuweisen

Ich möchte ein Funktionsverzeichnis verwenden, um meine Funktionen basierend auf einer Metrik zu organisieren, die sie berechnen. Außerdem werden die Berechnungen in anderen Spalten vorgenommen. Andere Datenspaltennamen sind möglicherweise nicht konsistent und müssen während der Ausführung definiert werden.

Beispiel Dataset

cost method metric rate total planned 
0  CPMV 2000 100   1000 
1  CPMV 4000 100   1000 
2  Flat  0  0   1000 
3  Flat  0  0    0 
4  Free  1  2    3 

ich brauche Kosten auf die Kostenmethode zur Berechnung basiert. CPMV muss die Metrik durch 1000 dividiert und mit der Rate multipliziert werden, Flat muss "total geplant" dividiert durch eine statische Variable haben, die in Kampagnenlänge (kann auf 2 gesetzt werden) flight_length, und Free muss 0 sein.

Antwort

1

Dies kann erreicht werden, indem zuerst ein Funktionsverzeichnis mit den Feldargumenten erstellt wird, die Sie in Ihren Berechnungen verwenden möchten. Mit einem Lambda innerhalb einer Anwendungsfunktion können Sie bestimmen, welche Schlüsselfunktion Sie verwenden möchten.

Wenn Sie eine flight_length von 0 mit einer safe_div-Funktion berechnen, wird anstelle eines Fehlers total_planned zurückgegeben.

# make safe_div 
def safe_div(x,y): 
    if y == 0: 
     return x 
    return x/y 

# write the dictionary 
def applyCalculateSpend (df_name, cost_method_col, metric_col, rate_col, total_planned_col): 
    calculations = { 
      'CPMV' : df_name[metric_col]/1000 * df_name[rate_col], 
      'Flat' : safe_div(df_name[total_planned_col], flight_week_diff), 
      'Free' : 0 
      } 
    df_method = df_name[cost_method_col] 
    return calculations.get(df_method, "not in dict") 

# call the function inside a lambda 
test_df['spend'] = test_df.apply(lambda row: applyCalculateSpend(
row, 
cost_method_col='cost method', 
metric_col='metric', 
rate_col='rate', 
total_planned_col='total planned'), axis = 1) 

    cost method metric rate total planned spend 
0  CPMV 2000 100   1000 200.0 
1  CPMV 4000 100   1000 400.0 
2  Flat  0  0   1000 500.0 
3  Flat  0  0    0 0.0 
4  Free  1  2    3 0.0 
Verwandte Themen