Значение истины серии неоднозначно при использовании цикла «Пока» - PullRequest
2 голосов
/ 23 марта 2019

Этот вопрос, безусловно, задавался во многих формах ранее, однако мне не удалось найти такой, который включал бы несколько последовательных входов, а также цикл while.Отсюда мой вопрос:

Без необходимости в цикле for перед циклом while возможно ли вывести ряд из этой функции:

def modify_to_100(first, second):
    combined = first + second

    while combined != 100:
        combined += 1

    return abs(combined)

Я передаю несколько рядов панд функции.Сериалы всегда одинаковой длины.

In [132]: first = pd.Series([50, 60, 40])
In [133]: second = pd.Series([20, 10, 40])
In [134]: modify_to_100(first,second)

Ошибка, которую я получаю, - она ​​достаточно наглядна и понятна.Однако, поскольку для каждого элемента Серии требуется разное количество циклов, я не знаю, как лучше всего справиться с этой ситуацией.

Out [134]: ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Я попробовал a.all(), как пример, и, как и ожидалось, это заставляет цикл работать вечно.Никогда не будет времени, когда для всех () чисел будет добавлено 1, и они одновременно достигнут 100.

Другие a.empty(), a.bool(), a.item(), a.any(), похоже, не применяются.Я неправильно понимаю один из них, который может позволить каждому элементу серии развиваться индивидуально?

Пока все, что я обнаружил, предполагает, что цикл for необходим. Я бы не хотел идти здесь строка за строкой.

Желаемый результат:

100, 100, 100

Любая помощь, разъяснение или эффективный способ прогресса здесь будеточень признателен.

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Вы сравниваете ряд со скалярным значением. объединить это серия, а 100 является числовым значением.

Вы можете преобразовать серию в датафрейм и передать в функцию.

def modify_to_100(df):

    df['new'] = df['first'] + df['second']
    # df['new'] = np.where(df['new']!=100, 100, df['new'])
    while True:
        if all(df['new'].eq(100)):
            break
        df[df['new']<100] = df['new']+1

    return df['new'].values

first = pd.Series([50, 60, 40])
second = pd.Series([20, 10, 40])

print(modify_to_100(pd.DataFrame({'first':first.values, 'second':second.values})))
1 голос
/ 23 марта 2019

Эта ошибка появляется при попытке применить логические отношения к серии. Вы можете сделать это для элемента серии. Поэтому используйте цикл, извлеките элемент из серии и примените условие while поэлементно. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...