簡體   English   中英

無法匹配兩個不同 csvs 中的兩個值

[英]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.

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