2012-05-23 5 views
24

Ich habe eine DataFrame mit ein paar Spalten. Eine Spalte enthält ein Symbol, für das die Währung verwendet wird, z. B. ein Euro- oder ein Dollarzeichen. Eine andere Spalte enthält einen Budgetwert. So könnte es beispielsweise in einer Zeile ein Budget von 5000 Euro bedeuten und in der nächsten Zeile ein Budget von 2000 Dollar.Bedingt füllen Spalte Werte auf der Grundlage einer anderen Spalten Wert in Pandas

In Pandas möchte ich meinem Datenrahmen eine zusätzliche Spalte hinzufügen, die die Budgets in Euro normalisiert. Grundsätzlich sollte der Wert in der neuen Spalte für jede Zeile der Wert aus der Budgetspalte * 1 sein, wenn das Symbol in der Währungsspalte ein Eurozeichen ist, und der Wert in der neuen Spalte sollte der Wert der Budgetspalte sein * 0,78125, wenn das Symbol in der Währungsspalte ein Dollarzeichen ist.

Ich weiß, wie man eine Spalte hinzufügt, sie mit Werten füllt, Werte aus einer anderen Spalte kopiert, aber nicht, wie die neue Spalte bedingt auf dem Wert einer anderen Spalte gefüllt wird.

Irgendwelche Vorschläge?

Antwort

45

Sie wollen wahrscheinlich

df['Normalized'] = np.where(df['Currency'] == '$', df['Budget'] * 0.78125, df['Budget']) 
+1

Ist es möglich, so etwas zu tun, aber mit Worten anstelle von Zahlen? –

5

ähnliche Ergebnisse über einen alternativen Stil zu tun sein könnten, eine Funktion zu schreiben, den die Operation durchführt Sie auf einer Zeile wollen, mit row['fieldname'] Syntax Einzelwert/Spalten zuzugreifen, und dann führen eine DataFrame.apply Methode auf sie

dies die Antwort auf die Frage hier verknüpft Echos: pandas create new column based on values from other columns

def normalise_row(row): 
    if row['Currency'] == '$' 
    ... 
    ... 
    ... 
    return result 

df['Normalized'] = df.apply(lambda row : normalise_row, axis=1) 
1

Wenn Sie den Vorschlag von Tom Kimber einen Schritt weiterführen, können Sie ein Funktionsverzeichnis verwenden, um verschiedene Bedingungen für Ihre Funktionen festzulegen. Diese Lösung erweitert den Umfang der Frage.

Ich verwende ein Beispiel aus einer persönlichen Anwendung.

# 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], 
      '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 
4  Free  1  2    3 0.0