目前是可以實現你的需求,但我覺得可能還有小部分的邏輯問題需要釐清
例如 A to B 跟 B to A 算相同嗎 ? 雖然均值是一樣,但感覺在業務面應該是不同的
還有一些點寫到後來我也忘了,但再謹慎思考一下吧
# 載入資料
import pandas as pd
df = pd.read_csv('order.csv')
# 篩選出一天去兩次以上的紀錄
df = df[df.duplicated(['ID', 'DATE'], keep=False)]
# 用self join的方法進行匹配
df_after_merge = df.merge(df, how='left', left_on=['ID', 'DATE'], right_on=['ID', 'DATE'])
# 移除重複匹配 (篩選出左右兩邊不同的資料)
df_after_merge = df_after_merge[df_after_merge['ZIP_CODE_x'] != df_after_merge['ZIP_CODE_y']]
# 將匹配資料轉成frozenset進行比較
df_after_merge['CHECK'] = df_after_merge[['ZIP_CODE_x', 'ZIP_CODE_y']].values.tolist()
df_after_merge['CHECK'] = df_after_merge[['CHECK']].applymap(frozenset) # 取frozenset (set is unhashable)
# 移除左右兩邊重複資料 (如 AB、BA 為相同,只取一種)
result = df_after_merge.drop_duplicates(subset=['ID', 'CHECK'])
# 處理取均值需求
result['MEAN'] = result[['AMOUNT_x', 'AMOUNT_y']].mean(axis=1)
# 結果
result
# 篩選
df = df.query('ID in (1, 3)')
# 轉換
pd.pivot_table(df, values='AMOUNT', index=['ID', 'DATE'], columns=['ZIP_CODE'], aggfunc=np.mean)
參閱 https://pandas.pydata.org/docs/reference/api/pandas.pivot_table.html