2017-03-01 8 views
-1

EXサブセットすることができます、私は任意の支払いを持っていたdoesntのそれのように独立した第五の行が必要どのように私は、複数の条件でパンダに

Cat INVOICE_REF_NUMBER OPEN_ITEM_AMOUNT(Netted Amt) AMOUNT_ COLLECTED(Original Amt) COMPANY_CODE OPERATING_UNIT count 
invoice 0992541158 115606.38 578031.91 4380 6238 2 
payment 0992541158 0   -462425.53 4380 6238 2 
invoice 0090010917 1519   87803.4 2700 4315 2 
payment 0090010917 0   -86284.4 2700 4315 2 
invoice 0090007022 2039.55  13517  2700 4315 2 

を - 同じに関連するすべての行をグループ化することによって

+1

あなたはこれまでに何を試みましたか? – DyZ

+0

私は "cat"に基づいてcountifsを実行することでExcelで行いました。いずれのキーにも請求書と支払いの両方がある場合、Pythonで実装する必要があります。 –

+0

あなたは何をしたいのか説明する必要があります。しかし、あなたはいつもこのようなことをすることができます。 'df2 = df1 [df1 ['Column_Name'] == 'Condition']'。複数の条件の場合は、ORには '|'を、ORには '〜'を、 – MattR

答えて

0

スタート請求書。組み合わせた状態では、請求書が支払われているか否かに基づいて異なるがあります:

status = df.groupby("INVOICE_REF_NUMBER")['Cat'].sum() 
#INVOICE_REF_NUMBER 
#0090007022   invoice 
#0090010917 invoicepayment 
#0992541158 invoicepayment 
#Name: Cat, dtype: object 

、unpayed請求書と元の行を抽出します。

unpayed = df.join(status[status=='invoice'], rsuffix='_', how='right', 
        on='INVOICE_REF_NUMBER') 
#  Cat INVOICE_REF_NUMBER OPEN_ITEM_AMOUNT(Netted Amt)  Cat_ 
#4 invoice   0090007022      2039.55 invoice 

あなたは、重複を削除することができます「Cat_」コラムあなたがしたい場合は、:ここで

del unpayed['Cat_'] 
#  Cat INVOICE_REF_NUMBER OPEN_ITEM_AMOUNT(Netted Amt) 
#4 invoice   0090007022      2039.55 
0

は私のベストエフォートです:

# Assume nothing has a payment 
df['payment_count'] = 0 

# For each invoice, count the related payments by applying 
# a lambda function on each row (hence the axis=1) 
df.loc[df.Cat=='invoice', 'payment_count'] =  
    df.loc[df.Cat=='invoice'].apply(lambda x: \  
    df.loc[(df['INVOICE_REF_NUMBER']==x['INVOICE_REF_NUMBER']) \ 
    & df.Cat=='payment')], 'Cat').count(), axis=1) 

# Filter on the invoices without payments 
print((df[df.Cat=='invoice') & (df.payment_count==0)]) 
関連する問題