使用While循环时系列的真值不明确

时间:2019-03-23 03:24:47

标签: python pandas dataframe

这个问题以前肯定已经以多种形式被提出过,但是,我还没有找到一个包含多个串联输入以及while循环的问题。因此,我的问题是:

在while循环之前不需要for循环,是否可以从此函数输出一系列:

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 个答案:

答案 0 :(得分:2)

您正在比较具有标量值的序列。组合是一个序列,而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 :(得分:1)

当您尝试对系列应用逻辑关系时,会出现此错误。您可以对系列元素进行此操作。因此,使用循环,从系列中提取一个元素,然后逐个应用while条件。希望这会有所帮助!