这个问题以前肯定已经以多种形式被提出过,但是,我还没有找到一个包含多个串联输入以及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
任何帮助,澄清或有效的进展方式将不胜感激。
答案 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
条件。希望这会有所帮助!