Если заявление Panda Dataframe: Истинная ценность Серии неоднозначна
У меня есть датафрейм только с плавающими данными. Я в основном хочу создать новый столбец, который получит значение из другого столбца, если он удовлетворяет условию, и значение другого столбца, если это не так. Все мои столбцы имеют тип float.
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])
Я получаю следующую ошибку:
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().
Я не могу понять, что является неоднозначным.
Спасибо
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
2 ответа
Решение
Я действительно нашел способ обойти это.
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
Это дает мне "возврат", который я хотел. Тогда мне просто нужно построить индекс из этих возвратов, начиная с 1 в качестве первого значения.
Спасибо за вашу помощь.
df_merged[col].shift(1)== 1.0
вы сравниваете два разных типаdf_merged[col].shift(1)
вернуть фрейм данных Если вы хотите получить первое значение этого столбца, вы можете использовать iloc. 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