2017-12-21 1 views
1

Ich habe einen Datenrahmen mit nur Float-Daten. Ich möchte grundsätzlich eine neue Spalte erstellen, die den Wert aus einer anderen Spalte erhält, wenn sie eine Bedingung erfüllt, und den Wert einer anderen Spalte, wenn dies nicht der Fall ist. Alle meine Spalten sind vom Float-Typ.IF-Anweisung Panda Dataframe: Der Wahrheitswert einer Serie ist mehrdeutig

for col in list_scenarios: 
    df_merged['in_scenario_'+ col] = 1.0 
    print(df_merged['in_scenario_' + col]) 
    if df_merged[col].shift(1)== 1.0: 
     df_merged['in_scenario_' + col] = df_merged['in_scenario_'+ col].shift(1)*df_merged[asset +'_r'] 
    else: 
     df_merged['in_scenario_' + col] = df_merged['in_scenario_'+ col].shift(1) 
    print(df_merged['in_scenario_' + col]) 

bekomme ich folgende Fehlermeldung:

Traceback (most recent call last): 
    File "C:\Program Files\JetBrains\PyCharm 2017.3.1\helpers\pydev\pydev_run_in_console.py", line 52, in run_file 
    pydev_imports.execfile(file, globals, locals) # execute the script 
    File "C:\Program Files\JetBrains\PyCharm 2017.3.1\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile 
    exec(compile(contents+"\n", file, 'exec'), glob, loc) 
    File "C:/Users/Main/PycharmProjects/Macrobond_API/scenario testing.py", line 268, in <module> 
    if df_merged[col].shift(1)== 1.0: 
    File "C:\Users\Main\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\core\generic.py", line 1121, in __nonzero__ 
    .format(self.__class__.__name__)) 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

ich nicht herausfinden können, was nicht eindeutig ist.

Dank

My dataframe looks like this (month year are indices) 
      sp500_500 USA MEXICO sp500_500_r 
month year               
6  2017 2423.41 1.0  1.0  0.004814 
7  2017 2470.30 1.0  1.0  0.019349 
8  2017 2471.65 1.0  1.0  0.000546 
+0

Warum verwenden Sie kein verschachteltes 'np.where'? – user32185

Antwort

0

Ich fand tatsächlich einen Weg um ihn herum.

for col in list_scenarios: 
    df_merged['in_scenario_'+ col] = df_merged[asset +'_r'] 
    df_merged[col] = df_merged[col].shift(1) 
    df_merged.loc[df_merged[col] ==0, 'in_scenario_'+ col] = 0 

Dies gibt mir die "Returns", die ich wollte. Dann muss ich nur den Index von diesen Returns aufbauen, beginnend mit 1 als ersten Wert.

Danke für Ihre Hilfe.

1

df_merged[col].shift(1)== 1.0 Sie vergleichen zwei verschiedene Arten df_merged[col].shift(1) Rückkehr ein Datenrahmen. Wenn Sie den ersten Wert dieser Spalte erhalten möchten, können Sie Iloc verwenden. df_merged[col].iloc[0] == 1.0

a 
    x 
0 0 
1 1 
2 2 
3 3 
4 4 

a.x.shift(1) 

    x 
0 NaN 
1 1 
2 2 
3 3 
4 4 

a.x.iloc[0] 

1 
+0

Die Dinge sind, ich bin immer auf der Suche nach der relativen und nicht absoluten Position. –

+0

@RomM könnte man es ändern. Von was hängt es ab? – galaxyan

+0

Es ist im Grunde um jede Zeile zu durchlaufen. Nimm den Wert davor oder danach in einer Spalte, um Operationen in einer anderen Spalte auszuführen. Ich bin sowas mit STATA gewohnt, aber nicht mit Python. –

Verwandte Themen