我有一个大熊猫系列,如下所示:
dish_name
Chiken Biryani 3
Mutton Biryani 1
Paneer Biryani 4
Paneer Pulav 2
sandwitch 2
我正在计算(3 /(3 + 1 + 4 + 2 + 2)然后第二个元素(1 /(3 + 1 + 4 + 2 + 2),依此类推到系列结束。我是哪个使用python中的以下代码执行此操作:
def dish_push(dish_data):
dish_number = len(dish_data)
for i in range(dish_number):
dish = ((dish_data[i])/(dish_data[0:dish_number].sum()))*100
return dish
但是当我将一个系列传递给这个函数时,它只输出最后一个值。
dish_push(dish_quantity_sold)
Out[291]: 16.666666666666664
我期待这样的地方..
25.0
8.33333333333
33.3333333333
16.6666666667
16.6666666667
我在回复声明中做错了吗?为什么要打印最后一个值?请帮忙。
答案 0 :(得分:2)
如果dish
是具有值[3, 1, 4, 2, 2]
的系列,则可以通过执行以下操作获得您正在寻找的结果而无需迭代:
result = dish / dish.sum() * 100
答案 1 :(得分:1)
我意识到这是一个相当丑陋的解决方案,但您期望它做的是以下内容:
def dish_push(dish_data):
dish_number = len(dish_data)
dish = []
for i in range(dish_number):
dish.append(((dish_data[i])/(dish_data[0:dish_number].sum()))*100)
return dish
也就是说,您不会在每次迭代中覆盖结果,而是将其附加到列表中。
答案 2 :(得分:1)
jonchar已经展示了执行特定任务的最佳方法,但是对于您的问题,问题是每次循环时,您都会使用该迭代中的系列覆盖dish
变量。最后,返回循环中的最后一个dish
值。
你需要做的是这样的事情:
def dish_push(dish_data):
dish_number = len(dish_data)
new_data = np.zeros_like(dish_data)
for i in range(dish_number):
new_data[i] = ((dish_data[i])/(dish_data.sum()))*100
return new_data
这会创建一个零数组,将每个值放在该数组中,并在添加值后返回新数组。
但是,可以通过使用enumerate
并直接循环数据来进一步简化它。在循环的每个循环中,这将为您提供每个数据点和该数据点的索引。此外,您可以计算一次而不是每次计算总和。这也允许您就地更改原始数据,因为已经计算了总和,因此在更改值时不会更改。由于这些值是就地更改的,因此您不必返回任何内容,因为您可以使用传递给dish_push
的数组(尽管为了以防万一我将保留返回值):
def dish_push(dish_data):
dish_sum = dish_data.sum()/100
for i, idata in enumerate(dish_data):
dish_data[i] = idata /dish_sum
return dish_data