我在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)
如果有任何方法可以告诉我这个过程吗?
答案 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。