2016-03-31 2 views
1

У меня есть проект, где для каждой строки в таблице мне нужно перебирать строки из другой таблицы и обновлять значения в обоих. Изменения должны придерживаться следующей итерации. Каков наилучший способ сделать это?Как обновить значение dataframe

for invoice_line in invoices.itertuples(): 
    qty = invoice_line.SHIP_QTY 
    for receipt_line in receipts[receipts.SKU == invoice_line.SKU].itertuples(): 
     if qty > receipt_line.REC_QTY: 
      receipts.set_value(receipt_line.index,'REC_QTY',0) 
      qty = qty - receipt_line.REC_QTY 
     else: 
      receipts.set_value(receipt_line.index,'REC_QTY', receipt_line.REC_QTY - qty) 
      qty = 0 
     recd = receipt_line.REC_DATE 
     if qty < 1:break 
    invoices.set_value(invoice_line.index,'REC_DATE',recd) 

set_value похоже не работает.

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD')) 

for row in df.itertuples(): 
    df.set_value(row.index,'test',row.D) 

print df.head() 

ответ

5

Я думаю, что вы хотите это капитализированные Index

import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.randn(50, 4), columns=list('ABCD')) 

for row in df.itertuples(): 
    df.set_value(row.Index,'test',row.D) 

print df.head() 
+0

это определенно полезно! жаль, что у меня не хватило репутации, чтобы поддержать вас. – Mateyobi

+0

Если это ответ на ваш вопрос, вы можете нажать зеленый флажок под стрелками голосования. Если не продержаться для лучшего ответа =). – John

+0

Я проверил вас. пожалуйста, повысьте мой пост! – Mateyobi

0

Не 100% уверен, что это то, что вы хотите, но я думаю, что вы пытаетесь петли через список и обновить значение ячейки в кадре данных. Синтаксис для этого есть:

for ix in df.index: 
    df.loc[ix, 'Test'] = 'My New Value' 

где IX является положение строки и «Test» это имя столбца, который вы хотите обновить. Если вам нужно добавить больше логики, вы можете попробовать что-то вроде:

for ix in df.index: 
    row = df.loc[ix] 
    if row.myVariable < 100: 
     df.loc[ix, 'SomeColumn'] = 'Less than ahundred' 
    else: 
     df.loc[ix, 'SomeColumn'] = 'ahundred or more' 
Смежные вопросы