我需要檢查具有不同日期的兩個資料集中隨時間變化的內容:
之前的日期:
Date ID Value Category Subcategory
30-Nov 0001 100.00 A A100
30-Nov 0002 200.00 B B120
30-Nov 0003 300.00 C C300
30-Nov 0004 450.00 D D900
30-Nov 0005 500.00 D D900
當前日期:
Date ID Value Category Subcategory
31-Dec 0001 100.00 A A100
31-Dec 0002 200.00 B B101
31-Dec 0003 300.00 C C300
31-Dec 0004 400.00 E E900
31-Dec 0006 600.00 D D900
現在我需要創建 4 個資料框:
- 價值變化:
Date ID Value Category Subcategory Prior Value
31-Dec 0004 400.00 E E900 450.00
- 類別變化:
Date ID Value Category Subcategory Prior Category
31-Dec 0004 400.00 E E900 D
- 子類別的變化,但前提是類別沒有變化:
Date ID Value Category Subcategory Prior Subcategory
31-Dec 0002 200.00 B B101 B120
- 物品數量變化:
Date ID Value Category Subcategory
31-Dec 0006 600.00 D D900
30-Nov 0005 500.00 D D900
我想我應該首先運行人口檢查并排除那些中斷,所以我將只有兩個具有相同 ID 集的資料集。我將按照這里的示例進行操作: 比較兩個資料幀并獲取差異
為了比較 1to1 值,我找到了一段 numpy 代碼,但它按默認索引而不是 ID 進行比較,如何使用我的 ID 列作為記錄識別符號進行比較?這將是一個大型資料集,我不能將其基于默認索引。
value_df = current_df
value_df['prior value'] = np.where(prior_df['Value'] == current_df['Value'], 'Match', prior_df['Value'])
value_df = value_df[value_df['prior value'] != 'Match']
對于多個條件,我是否必須逐步過濾掉它(首先過濾掉類別更改,然后過濾子類別更改),或者我可以使用 AND 連接條件嗎?
下面是創建資料框的代碼:
prior_data = {'Date': ['30-Nov','30-Nov','30-Nov','30-Nov', '30-Nov'],
'ID': ['0001','0002','0003','0004', '0005'],
'Value' : [100.00, 200.00, 300.00, 450.00, 500.00],
'Category' : ['A','B','C','D','D'],
'Subcategory' : ['A100','B120','C300','D900','D900']}
current_data = {'Date': ['31-Dec','31-Dec','31-Dec','31-Dec','31-Dec'],
'ID': ['0001','0002','0003','0004', '0006'],
'Value' : [100.00, 200.00, 300.00, 400.00, 600.00],
'Category' : ['A','B','C','E','D'],
'Subcategory' : ['A100','B101','C300','E900','D900']}
prior_df = pd.DataFrame(prior_data)
current_df = pd.DataFrame(current_data)
uj5u.com熱心網友回復:
我不確定這是否是最快的解決方案,但這個問題似乎需要pd.merge. 正如您所說,讓我們首先處理一個資料幀中而不是另一個資料幀中的內容:
def get_only_left(df1, df2):
left_merge = pd.merge(df1, df2, on='ID', suffixes=('', '_other'), how='left')
added_columns = [c '_other' for c in df1.columns if c != 'ID']
mask = left_merge.loc[:, added_columns].isna().all(axis=1)
return left_merge[mask].drop(added_columns, axis=1)
pd.concat([get_only_left(prior_df, current_df), get_only_left(current_df, prior_df)])
這給
Date ID Value Category Subcategory
4 30-Nov 0005 500.0 D D900
4 31-Dec 0006 600.0 D D900
然后,讓我們處理適當變化的值。
columns = list(current_df.columns)
df = pd.merge(current_df, prior_df, on='ID', suffixes=('', '_prior'), how='inner')
mask = df['Value'] != df['Value_prior']
df[mask].loc[:, columns ['Value_prior']]
這給
Date ID Value Category Subcategory Value_prior
3 31-Dec 0004 400.0 E E900 450.0
然后類似地:
mask = df['Category'] != df['Category_prior']
df[mask].loc[:, columns ['Category_prior']]
給
Date ID Value Category Subcategory Category_prior
3 31-Dec 0004 400.0 E E900 D
最后
import numpy as np
mask = np.logical_and(df['Category'] == df['Category_prior'], df['Subcategory'] != df['Subcategory_prior'])
df[mask].loc[:, columns ['Subcategory_prior']]
給
Date ID Value Category Subcategory Subcategory_prior
1 31-Dec 0002 200.0 B B101 B120
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/403494.html
標籤:
