2016-09-24 10 views
0

を生成しない、次のように私はパンダのデータフレームを持っている:パンダのデータフレームの各行の機能が、新しい列

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

mは、Pythonと最適化ソフトウェアのインタフェースとして定義されています。 .iterrowsは私のために働く。ありがとう! – user36729

答えて

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>] * nnポインタを作成しますか同じ<list>への参照ではなく、nの独立したリストを参照してください。 nのコピーを変更すると、すべてのコピーがnに変更されます。それがあなたが望むものでないなら、関数を使用してください。詳細については、this question and it's answersを参照してください。具体的には、this answer

関連する問題