在pandas DataFrame的每一行上的函数,但不生成新列

时间:2016-09-24 05:34:44

标签: function pandas dataframe

我在pandas中有一个数据框如下:

  A    B    C    D
  3    4    3    1
  5    2    2    2
  2    1    4    3

我的最终目标是使用此数据框每行中的信息为优化问题产生一些约束,因此我不想生成输出并将其添加到数据框中。我这样做的方式如下:

def Computation(row):

    App = pd.Series(row['A'])

    App = App.tolist()

    PT = [row['B']] * len(App)

    CS = [row['C']] * len(App)

    DS = [row['D']] * len(App)

    File3 = tuplelist(zip(PT,CS,DS,App))

    return m.addConstr(quicksum(y[r,c,d,a] for r,c,d,a in File3) == 1)

但是通过调用它无法解决问题:

df.apply(Computation, axis = 1)

如果有任何方法可以告诉我这个过程吗?

1 个答案:

答案 0 :(得分:1)

.apply将尝试将函数返回的值转换为pandas Series或DataFrame。因此,如果这不是您的目标,那么最好使用.iterrows

# In pseudocode:
for row in df.iterrows:
    constrained = Computation(row)

此外,您的Computation可以表示为:

def Computation(row):
    App = list(row['A']) # Will work as long as row['A'] is iterable

    # For the next 3 lines, see note below.
    PT = [row['B']] * len(App)
    CS = [row['C']] * len(App)
    DS = [row['D']] * len(App)

    File3 = tuplelist(zip(PT,CS,DS,App))
    return m.addConstr(quicksum(y[r,c,d,a] for r,c,d,a in File3) == 1)

注意:[<list>] * n会创建n指针或引用相同的<list>,而不是n个独立列表。对n的一个副本的更改将更改n中的所有副本。如果这不是您想要的,请使用功能。有关详细信息,请参阅this question and it's answers。具体而言,this answer