[英]Cannot match two values in two different csvs
我正在解析兩個單獨的 csv 文件,目的是找到匹配的客戶 ID 和日期來操縱余額。
在我的 for 循環中,在某些時候應該有一個匹配,因為我故意在我的 csv 中放置重復的 ID 和日期。 但是,在解析和嘗試匹配數據時,即使值相同,匹配也無法正常工作。
主要文件:
transactions = pd.read_csv(INPUT_PATH, delimiter=',')
accounts = pd.DataFrame(
columns=['customerID', 'MM/YYYY', 'minBalance', 'maxBalance', 'endingBalance'])
for index, row in transactions.iterrows():
customer_id = row['customerID']
date = formatter.convert_date(row['date'])
minBalance = 0
maxBalance = 0
endingBalance = 0
dict = {
"customerID": customer_id,
"MM/YYYY": date,
"minBalance": minBalance,
"maxBalance": maxBalance,
"endingBalance": endingBalance
}
print(customer_id in accounts['customerID'] and date in accounts['MM/YYYY'])
# Returns False
if (accounts['customerID'].equals(customer_id)) and (accounts['MM/YYYY'].equals(date)):
# This section never runs
print("hello")
else:
print("world")
accounts.loc[index] = dict
accounts.to_csv(OUTPUT_PATH, index=False)
交易 CSV :
customerID,date,amount
1,12/21/2022,500
1,12/21/2022,-300
1,12/22/2022,100
1,01/01/2023,250
1,01/01/2022,300
1,01/01/2022,-500
2,12/21/2022,-200
2,12/21/2022,700
2,12/22/2022,200
2,01/01/2023,300
2,01/01/2023,400
2,01/01/2023,-700
帳戶 CSV
customerID,MM/YYYY,minBalance,maxBalance,endingBalance
1,12/2022,0,0,0
1,12/2022,0,0,0
1,12/2022,0,0,0
1,01/2023,0,0,0
1,01/2022,0,0,0
1,01/2022,0,0,0
2,12/2022,0,0,0
2,12/2022,0,0,0
2,12/2022,0,0,0
2,01/2023,0,0,0
2,01/2023,0,0,0
2,01/2023,0,0,0
預期帳戶 CSV
customerID,MM/YYYY,minBalance,maxBalance,endingBalance
1,12/2022,0,0,0
1,01/2023,0,0,0
1,01/2022,0,0,0
2,12/2022,0,0,0
2,01/2023,0,0,0
從信息中不清楚formatter.convert_date
函數的作用。 但從您添加的示例 CSV 來看,它似乎應該執行以下操作:
def convert_date(mmddyy):
(mm,dd,yy) = mmddyy.split('/')
return mm + '/' + yy
此外,確保數據類型也相同(兩個日期字段都是字符串,也用於客戶 ID)
您的問題來自您與熊貓系列進行的比較,為了簡單起見,當您這樣做時:
customer_id in accounts['customerID']
您正在檢查customer_id
是否是系列accounts['customerID']
的索引,但是,您想要檢查系列的值。
在您的 if 語句中,您使用的是pd.Series.equals
方法。 這是文檔中該方法的作用的解釋
此函數允許將兩個 Series 或 DataFrame 相互比較,以查看它們是否具有相同的形狀和元素。 相同位置的 NaN 被認為是相等的。
所以 equals 用於比較 DataFrames 和 Series,這與您嘗試做的不同。
有多種方法可以實現您想要做的事情,最簡單的方法就是在進行比較之前從系列中獲取值:
customer_id in accounts['customerID'].values
請注意, accounts['customerID'].values
返回一個包含系列值的 NumPy 數組。
所以你的比較應該是這樣的:
print(customer_id in accounts['customerID'].values and date in accounts['MM/YYYY'].values)
並在您的 if 語句中使用相同的東西:
if (customer_id in accounts['customerID'].values and date in accounts['MM/YYYY'].values):
您還可以使用pandas.Series.isin
函數,給定一個元素作為輸入返回一個布爾系列,顯示系列中的每個元素是否與給定輸入匹配,然后您只需要檢查布爾系列是否包含一個真值。
isin 文檔: https ://pandas.pydata.org/docs/reference/api/pandas.Series.isin.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.