iT邦幫忙

0

Python Dataframe篩選與轉換技巧請教

  • 分享至 

  • xImage

目前手邊有一份資料如下(金額為當日某地區總金額):
https://ithelp.ithome.com.tw/upload/images/20220502/201480375ZhyTzRb6w.png
現在想要篩選顧客同一日去了某地以外還去了哪裡,並且計算兩地的平均值,轉換成如下的關聯表(以106為例):
https://ithelp.ithome.com.tw/upload/images/20220502/20148037gD6yloHZ73.png

請教各位大神在使用Python/pandas處理上有什麼方法可以做到,感謝各位大神!!

增廣建文 iT邦研究生 5 級 ‧ 2022-05-02 20:07:59 檢舉
groupby後mean
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
Peter
iT邦新手 4 級 ‧ 2022-05-03 13:58:07
最佳解答

目前是可以實現你的需求,但我覺得可能還有小部分的邏輯問題需要釐清
例如 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

01
02
03
04
05
06

因為資料有些不齊全,所以邏輯上比較寬鬆,不過你的方法已經達到我想要的結果了,非常感謝大神!!

0
I code so I am
iT邦高手 1 級 ‧ 2022-05-03 08:06:25
# 篩選
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

我要發表回答

立即登入回答