pandas merge 後行數變多或對不上怎麼辦提示詞(關聯鍵重複、類型不一致、空格大小寫、validate 與 indicator 排查)

用 pandas 合併兩張表後行數莫名變多、金額彙總被放大,或者大量行匹配不上變成空值時用:描述兩張表和合並代碼,AI 給出一套診斷代碼找出鍵重複、類型不一致、格式差異等原因,並改寫成帶校驗的合併寫法。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名嚴謹的數據分析師,合併數據時總是先驗證再相信結果。我的 pandas 合併結果有問題,請幫我排查。

- 合併代碼(原樣粘貼):
  [合併代碼]
- 左表與右表的結構(各自的 head、dtypes、行數):
  [兩表結構]
- 現象:[現象](例:合併前 1 萬行,合併後 1.3 萬行;或右表字段大量為空)
- 業務上兩表的關係:[業務關係](例:一個訂單對應一個客戶,應該是多對一)

請先給出一段診斷代碼,逐項檢查:
1. 關聯鍵在兩表中是否唯一:統計重複的鍵及其出現次數,列出重複最多的幾個鍵。行數變多幾乎總是因為右表(或兩表)的鍵有重複。
2. 關聯鍵的類型是否一致:一邊是整數、一邊是字符串;或者一邊是浮點(例如因為有空值,整數列被讀成了浮點,出現「123.0」)。
3. 格式差異:前後空格、大小寫、前導零、全角半角。
4. 空值:關聯鍵為空的行有多少,它們在合併中會怎樣。
5. 用 indicator 參數統計「只在左表、只在右表、兩表都有」的行數,找出匹配不上的樣例。

然後:
- 根據診斷結果判斷原因;
- 給出修正後的合併代碼:先清洗鍵(統一類型與格式),右表重複時根據業務決定是去重、聚合後再合併,還是這本來就是一對多關係、後續彙總時需要注意;
- 在合併中使用 validate 參數聲明期望的關係(一對一、多對一等),關係不符時直接報錯,而不是悄悄產生錯誤結果;
- 合併後增加斷言:行數、關鍵金額的合計與合併前一致。
- 說明 how 參數(left、inner、outer)的選擇對結果的影響。

高亮處換成你自己的內容:[合併代碼]、[兩表結構]、[現象]、[業務關係]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[兩表結構] 至少包括兩張表的行數、關聯鍵列的類型和幾行樣例。[業務關係] 非常重要,AI 要據此判斷「行數變多」是錯誤,還是一對多關係下的正常現象。

常見坑:

  • 右表本該一個客戶一行,實際因為歷史數據有重複,合併後訂單被複製成兩行,銷售額憑空多出一截。合併時用 validate 聲明期望的關係,能第一時間發現。
  • 整數列中有空值,被 pandas 讀成浮點數,編號變成「1001.0」,和另一張表的「1001」匹配不上。
  • 合併後只看前幾行覺得沒問題,沒有核對總行數和金額合計,問題直到報表上線才被發現。

追問技巧:追問「把這套檢查封裝成一個函數,以後每次合併都調用它並打印檢查報告」。

示例輸出

示例,僅供參考(診斷代碼節選)
python
# 1. 鍵是否唯一
dup = customers["客戶編號"].value_counts()
print("右表重複的鍵:\n", dup[dup > 1].head(10))

# 2. 類型是否一致
print(orders["客戶編號"].dtype, customers["客戶編號"].dtype)

# 5. 匹配情況統計
check = orders.merge(customers, on="客戶編號", how="outer", indicator=True)
print(check["_merge"].value_counts())
print(check.loc[check["_merge"] == "left_only", "客戶編號"].head())

修正後的合併:

python
def norm_key(s: pd.Series) -> pd.Series:
    return s.astype("string").str.strip().str.lstrip("0")   # 統一為字符串,去空格與前導零

orders["客戶編號"] = norm_key(orders["客戶編號"])
customers["客戶編號"] = norm_key(customers["客戶編號"])
customers = customers.drop_duplicates("客戶編號", keep="last")   # 業務確認:保留最新一條

merged = orders.merge(customers, on="客戶編號", how="left", validate="many_to_one")
assert len(merged) == len(orders)
assert abs(merged["金額"].sum() - orders["金額"].sum()) < 1e-6   # 浮點數用近似比較

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~