Pandas Сравнение (логическое) смежных столбцов с новым столбцом - PullRequest
1 голос
/ 09 мая 2020

В приведенных ниже данных мне нужно добавить дополнительные столбцы на основе определенных сравнений.

test_file.csv

day v1  v2  v3
mon 38  42  42
tue 45  35  43
wed 36  45  43
thu 41  35  45
fri 37  42  44
sat 40  43  42
sun 43  40  43

Я пробовал эти строки кода, и он вызывает ошибка отображается сразу под кодом.

df["Compare_col_1"] = ""
df["Compare_col_2"] = ""

if ((df.v3 < df.v1) & (df.v2 > df.v1)):
    df["Compare_col_1"] = "Balanced"
else:
    df["Compare_col_1"] = "Out_of_Bounds"


if df.v3 < df.v2:
    df["Compare_col_2"] = "Eligible"
else:
    df["Compare_col_2"] = "Slow"

Ошибка (только при использовании Pandas)

Traceback (most recent call last):
  File "C:\Trials\Test.py", line 291, in 
    if ((df.v3  df.v1)):
  File "C:\Winpy\WPy64-3770\python-3.7.7.amd64\lib\site-packages\pandas\core\generic.py", line 1479, in __nonzero__
    f"The truth value of a {type(self).__name__} is ambiguous. "
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Теперь я видел несколько статей, таких как эта , дает отличное объяснение того, как использовать numpy для получения нужных мне результатов. Но та же ошибка повторяется, как показано ниже ..

Новый код (с numpy):

if (np.logical_and((df.SMA_8d < df.ClosePrice) , (df.ClosePrice < df.SMA_3d))):
    df["Mark2"] = "True"
else:
    df["Mark2"] = "False"
Traceback (most recent call last):
  File "C:\Trials\Test.py", line 291, in 
    if (np.logical_and((df.v3  df.v1))):
  File "C:\Winpy\WPy64-3770\python-3.7.7.amd64\lib\site-packages\pandas\core\generic.py", line 1479, in __nonzero__
    f"The truth value of a {type(self).__name__} is ambiguous. "
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Есть ли какое-либо решение для создания этих новых столбцов путем сравнения соседние столбцы (и, что более важно, решение только в pandas ...)

1 Ответ

3 голосов
/ 09 мая 2020

вы можете использовать np.where например:

df["Compare_col_1"] = np.where((df.v3<df.v1)&(df.v2>df.v1), "Balanced", "Out_of_Bounds")
df["Compare_col_2"] = np.where(df.v3<df.v2, "Eligible", "Slow")
...