我有一個 DataFrame,它是大型 SQL 查詢的結果。我正在嘗試將 DataFrame 分類為 2 個單獨的 DataFrame。NVI 和主要。它們都是卡車維修清單。我需要根據是否有特定的組態檔 id 7055 對其進行排序。這將進入 NVI DataFrame
如果遇到該作業,我需要從“RO”“單元號”和“修復日期”列中獲取值。然后我需要獲取這些值并再次搜索 DataFrame 并獲取具有匹配 RO 和單元號或匹配單元號和修復日期等于或早于 7055 行中的日期值的任何行被找到。然后這些行需要進入 NVI df。任何剩余的不匹配的行都將進入主 df。
唯一的靜態值是 7055 的組態檔 ID。RO 單元號和維修日期都將不同。
class nvi_dict(dict):
def __setitem__(self, key, value):
key = key.profile()
super().__setitem__(key, value)
nvisort = pd.DataFrame()
def sort_nvi_dict(row, component):
if row ['PROFILE_ID'] in cfg[component]['nvi']:
nvi_ro = nvi_dict()
nvi_ro ['RO'] = row ['RO']
nvi_ro ['UnitNum'] = row ['VFUNIT']
nvi_ro ['date']= row['REPAIR_DATE']
nvisort = nvidf.apply(lambda x: sort_nvi_dict(x, 'nvi_ro'), axis=1, result_type='expand')
我想過嘗試使用一個類來創建一個臨時字典物件來存盤來自 RO、UnitNum 和 Date 的值。然后我可以呼叫它來再次遍歷 df 以尋找匹配的值。
我正在使用 .yml 檔案來存盤字典。我用來在整理出 NVI 和 Main df 后對它們進行進一步排序。因為它們隨后需要由卡車制造商進行分類
uj5u.com熱心網友回復:
我認為這可能有效,但沒有測驗資料就無法測驗......
df1 = nvisort[nvisort['profile_id'] = 7055]
df2 = pd.merge(nvisort,df1[['RO','Unit Number']],on=['RO','Unit number'],how='right')
df3 = pd.merge(nvisort,df1[['Unit Number','Repair Date']],on='Unit Number'],how='right')
df3 = df3[df3['Repair Date_x'] <= df3['Repair Date_y']]
df3 = df3.drop(columns='Repair Date_y']
df3 = df3.rename(columns={'Repair Date_x':'Repair Date'})
NVI = pd.concat([df1,df2,df3])
Main = pd.concat([NVI,nvisort]).drop_duplicates(keep=False)
我假設您的原始/起始資料框是nvisort,然后我們對其進行過濾以獲取 7055 的 profile_id 并將其稱為 df1
然后我們將把你的兩個不同的標準放入 df2 和 df3。
df2 只是 RO 和 Unit Number 匹配的原始資料幀上的過濾器,因此我們可以使用它pd.merge()來有效地獲取該過濾器。
df3 是一個更復雜的過濾器,因為它小于或等于,而不是等于。因此,首先我們進行合并以過濾匹配的單元號,但我們還將兩個表中的修復日期帶入 df3,這些將被附加_x到_y列名上。因此,我們過濾日期_x小于 on的位置_y,然后對其進行清理。
最后,您可以通過從原始 nvisort 中找到不在 NVI 中的所有內容來獲取 Main。由于 NVI 是 nvisort 的子集,因此您可以將它們連接起來并洗掉所有重復項,只留下其中一個資料幀中存在的資料。
uj5u.com熱心網友回復:
根據我對您的問題的理解,您想根據某些條件將資料框分為 2 嗎?
df1 = df[<condition>]
條件可以是 -df[profile id] == 7055 and Allunits.contains(df[unit])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518342.html
標籤:Python熊猫数据框
