簡體   English   中英

在另一列中查找列負值 - dataframe

[英]Find columns negative value in another column - dataframe

我有這個代碼:

test = {"number": ['1555','1666','1777', '1888', '1999'],
        "order_amount": ['100.00','200.00','-200.00', '300.00', '-150.00'],
        "number_of_refund": ['','','1666', '', '1888']
    }

df = pd.DataFrame(test)

它返回以下 dataframe:

  number order_amount number_of_refund
0   1555       100.00                 
1   1666       200.00                 
2   1777      -200.00             1666
3   1888       300.00                 
4   1999      -150.00             1888    

如果出現以下情況,我想刪除訂單和訂單退款條目:

  • "number_of_refund" 匹配 "number" 列中的數字(如果上個月下訂單並在當月退款,dataframe 中可能沒有訂單數)
  • “number_of_refund”的數量(與“number”匹配)的“number”數量為負數(在這種情況下,數字 1666 有 200,而 1666 的退款有 -200,因此應該刪除這兩行)

所以這種情況下的結果應該是:

number order_amount number_of_refund
0   1555       100.00                 
3   1888       300.00                 
4   1999      -150.00           1888                            

如何檢查一列值的數量是否在另一列中但數量相反(負數)?

IIUC,您可以使用 boolean 索引方法:

# ensure numeric values
df['order_amount'] = pd.to_numeric(df['order_amount'], errors='coerce')

# is the row a refund?
m1 = df['number_of_refund'].ne('')
# get mapping of refunds
s = df[m1].set_index('number_of_refund')['order_amount']

# get reimbursements and find which ones will equal the original value
reimb = df['number'].map(s)
m2 = reimb.eq(-df['order_amount'])
m3 = df['number_of_refund'].isin(df.loc[m2, 'number'])

# keep rows that do not match any m2 or m3 mask
df = df[~(m2|m3)]

output:

  number  order_amount number_of_refund
0   1555         100.0                 
3   1888         300.0                 
4   1999        -150.0             1888

假設我將 1999 年的退款金額更改為-200.00

test = {"number": ['1555','1666','1777', '1888', '1999'],
        "order_amount": ['100.00','200.00','-200.00', '300.00', '-200.00'],
        "number_of_refund": ['','','1666', '', '1888']  }
df = pd.DataFrame(test)
print(df)

  number order_amount number_of_refund
0   1555       100.00                 
1   1666       200.00                 
2   1777      -200.00             1666
3   1888       300.00                 
4   1999      -200.00             1888

這是另一種方法。 我通過連接number_of_refund (用空白處的number列填充)和絕對order_amount (即沒有負號)來創建一個唯一的字符串,然后刪除找到的兩個重復項

df['unique'] = df.apply(lambda x: x['order_amount'].replace('-','')+'|'+x['number'] if x['number_of_refund']=='' else x['order_amount'].replace('-','')+'|'+x['number_of_refund'], axis=1)
#df['unique'] = df['order_amount'].str.replace('-','') + '|' + df['number_of_refund'].mask(df['number_of_refund'].eq(''), df['number'])  #the same
print(df)

  number order_amount number_of_refund       unique
0   1555       100.00                   100.00|1555
1   1666       200.00                   200.00|1666    #duplicate
2   1777      -200.00             1666  200.00|1666    #duplicate
3   1888       300.00                   300.00|1888
4   1999      -200.00             1888  200.00|1888

重復的行很容易識別,並准備被刪除(包括列unique

df = df.drop_duplicates(['unique'], keep=False).drop(columns=['unique'])
print(df)

  number order_amount number_of_refund
0   1555       100.00                 
3   1888       300.00                 
4   1999      -200.00             1888

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM