2017-12-06 9 views
0
df = mdb.read_table(mdbfile, "table") 
invoices = pd.read_csv(file, delimiter=';') 

lst = df[(df['El4'] == el4)] #contains specific rows of df 

for i, row in lst.iterrows(): 
    prop = row['propertyid'] 
    mouvement = (row['Mouvements']*-1) 

    a = invoices[(invoices['propertyReference'] == prop) & (invoices.invoiceGrossAmount == mouvement)] 
    invoiceid = a['invoiceId'].values 

    mouvement = (mouvement*-1) 

    if df[(df.propertyid == prop) & (df.Mouvements == mouvement)]: 
     df['id'] = invoiceid 

나는 다음과 같은 오류가 발생하는 값을 여러 열하여 dataframe를 필터링 추가 propmouvementsmouvement과 동일합니다.어떻게

+0

if df [(df.propertyid == prop) & (df.Mouvements == mouvement)] :'줄에서 오류가 발생하고 있습니까? – dubbbdan

+1

이렇게하려면 ['merge'] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html)를 사용할 수있는 것 같습니다. 게시물에 설명 된대로 병합 기준을 지정하십시오. – RagingRoosevelt

+0

@dubbdan 예 그 라인에 실제로 –

답변

0

내 의견에 대한 후속 조치. 그냥 가입하려고하는 것 같습니다 (또는 팬더 용어로 merge).

의가 소스 데이터로 시작하자, 나는 그 'propertyid'df에서 경기를 있으리라 믿고있어이 가입에서

df = df.merge(invoices, how='left', left_on=['propertyid', 'Mouvements'], right_on=['propertyReference', 'invoiceGrossAmount']) 

: 여기에서

df = mdb.read_table(mdbfile, "table") 
invoices = pd.read_csv(file, delimiter=';') 

, 우리는 데이터를 결합하려고 시도하는 'propertyReference'invoices이고 'Mouvements'df이고 'invoiceGrossAmount'invoices과 일치합니다. 필요에 따라 조정할 수 있습니다. 우리가 invoices에 일치하는 항목을 찾을 수 없습니다 오히려 그 행을 포함하지 않는 것보다 (이 경우 우리는 대신 how='inner'를 사용하는 것) 할 때 우리는 원래 df에서 null 값을 원하기 때문에 우리는 왼쪽을 사용하고

가입.

이렇게하면 for 루프를 사용할 필요가 없습니다. 어딘가에 독서를 기억합니다. 팬더가있는 루프를 사용하는 경우 내장 판다 방법으로 더 좋은 방법을 찾을 수 있습니다.

+0

답장을 보내 주셔서 대단히 감사합니다! 거의 완벽하게 구현합니다. 사실 나는 테이블을 병합하고 싶지 않습니다. df의 'propertyid'가 송장의 'propertyReference'와 일치하고 df의 'Mouvements'가 'invoiceGrossAmount'와 일치하는 경우에만 표 2의 invoiceid를 채워야합니다. –

+0

@ChristianVandeKoppel, 테이블 1과 테이블 2는 무엇입니까? 원래 게시물에서'df'와'invoices'에 대해 이야기했습니다. 두 테이블의 내용에 대한 예제를 제공하여 결과를 어떻게 보이게 할 수 있습니까? – RagingRoosevelt

0

또 다른 아이디어는 combine first 방법을 사용하는 것입니다.

이 방법을 사용하려면 두 데이터 프레임의 인덱스가 동일해야합니다. 뭔가 같이 :

# Its not clear is the sign on Movement needs to be changed to merge with invoices. If so, comment out the line below 
df.loc[:,'Mouvement] = df.loc[:,'Mouvement]*-1 
df = df.set_index('propertyid','Mouvement') 
invoices = invoices.set_index('propertyReference', 'invoiceGrossAmount') 
df = df.combine_first(invoices) 

이 제안 @RagingRoosevelt merge 방법과 매우 유사합니다.