如何从python

时间:2015-12-09 15:15:49

标签: python pandas

我有一个大熊猫系列,如下所示:

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

我在回复声明中做错了吗?为什么要打印最后一个值?请帮忙。

3 个答案:

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