今天寫代碼的時候碰到一個需求,兩個dataframe,一個是最新從新的csv拿的,一個是上一次生產的csv拿的,其中可能有些大小寫和名稱發送變化,要寫段腳本檢查出來
現在想到的思路是先算出差集(即兩個dataframe中相同的那部分),然後新增一列,這一列的屬性爲要檢查大小寫的列的大寫形態,然後將兩個dataframe進行外連接,匹配上的就是大小寫,沒匹配上的就是新名稱和舊名稱了。
代碼爲:
for dimiension in dimiensions:
# 3.1 找大小寫與new和miss
# 創建用來對比的df,columns爲dimiension,sbk, standard_date, dimension_upper
# 例如 check_new_df就是new_df的[dimiension,sbk, standard_date, dimension_upper]值
# check_miss_df就是miss_df的[dimiension,sbk, standard_date, dimension_upper]值
check_new_df = new_df[[dimiension, 'SBK', 'standard_date']].drop_duplicates(keep='first').copy()
check_miss_df = miss_df[[dimiension, 'SBK', 'standard_date']].drop_duplicates(keep='first').copy()
check_new_df['dimension_upper'] = check_new_df[dimiension].str.upper().copy()
check_miss_df['dimension_upper'] = check_miss_df[dimiension].str.upper().copy()
# 先找new和miss:有問題的值賦值給miss_key_df和new_key_df
# 對check_new_df和check_miss_df進行外連接,將左邊爲空的(即新文件中沒有但歷史中有的)賦值給miss_key_df,
# 將右邊爲空的(即歷史文件中沒有但新文件中有的)賦值給new_key_df
case_check_df = pd.merge(check_new_df, check_miss_df, how='outer', on=['SBK', 'standard_date', 'dimension_upper'])
field_x = dimiension+'_x'
field_y = dimiension+'_y'
# 防止dimension_upper爲空值干擾
case_check_df = case_check_df[case_check_df['dimension_upper'].notnull()].copy()
miss_key_df = case_check_df[case_check_df[field_x].isnull()].copy()
new_key_df = case_check_df[case_check_df[field_y].isnull()].copy()
# 再找大小寫的值
# 找出大小寫的情況賦值給case_df_1(對比的列能對比上但是field_x和field_y不相等的值)
case_df_1 = pd.merge(check_new_df, check_miss_df, how='inner', on=['SBK', 'standard_date', 'dimension_upper'])
case_df_1 = case_df_1[case_df_1[field_x] != case_df_1[field_y]].copy()
# 將大小寫,new和miss都變成list
miss_key_list = miss_key_df.values.tolist()
new_key_list = new_key_df.values.tolist()
case_df_1_list = case_df_1.values.tolist()