我想填充資料框的空行:
df= pd.DataFrame({ 'id':['A', 'B', 'C','D','J','K','Z','Y','H','G'],
'test1':[10, 9, 8,7,np.nan,6,np.nan,np.nan,5,np.nan]
})
基于以下字典:
dic1={'A': [['K', 'J'], 2.0],
'B': [nan, nan],
'C': [['Y'], 1.0],
'D': [['B', 'C'], 2.0],
'J': [nan, nan],
'K': [nan, nan],
'G': [['A', 'H'], 2.0],
'Y': [['Z'], 1.0],
'H': [nan, nan],
'Z': [['G'], 1.0]}
dict1顯示 df 中每個 id 有多少個孩子。例如,A 是 K 的父母,而 J.J 沒有孩子。G 有 A 和 H。df 中的空行屬于 id J、Y、Z 和 G。串列為我們提供了這些 id:new_list=['J', 'G', 'Y', 'Z']我想按照以下規則填充這些 id 的行:
如果 id 在 dic1 中沒有孩子 (NaN),則將零分配給 test1
如果 id 有 1 個孩子并且不是新的(不在 new_list 中),則用孩子的 test1 值填充 test1。
如果 id 有超過 1 個孩子(即 ['A','H'] for id=G)并且它們都不是新的,則用所有孩子的最大 test1 值填充 test1(即所有孩子的意思[A, H] 中的 A 和 H)。
如果該 id 有新的孩子,則為該孩子執行流程 1、2、3,然后為該 ID 執行流程 1、2、3。如果孩子也是新的并且還沒有填寫 df,那么首先為那個孩子執行這些步驟。
到目前為止,我已經設法實作了流程 1、2、3,但我不知道如何處理流程 4(如何集成我的代碼)。正確的輸出應該是這樣的:
df= pd.DataFrame({ 'id':['A', 'B', 'C','D','J','K','Z','Y','H','G'],
'test1':[10, 9, 8,7,0,6,10,10,5,10]
})
到目前為止,我的代碼是:
new_list=['J', 'G', 'Y', 'Z']
dic_df=dict(zip(df.task_id, df.test1))
act_aa={}
def test_newcase(i):
if str(dic1[i][0])=='nan':
df.loc[df['task_id'] == i, ['test1']] = 0
else:
if any(x not in new_list for x in dic1[i][0]):
if dic1[i][1]==1.0:
for k in dic1[i][0]:
df.loc[df['task_id'] == i, ['test1','test2']] = dic_df[k][0]
else:
for k in dic1[i][0]:
act_aa[k]=str(dic_df[k])[0]
if act_aa :
df.loc[df['task_id'] == i, ['test1']] = max(act_aa.values())
for i in new_list:
test_newcase(i)
df
隨著條件的處理,元素 (id) 正在更新,如果 id 沒有孩子 (NaN),則 df 將使用正確的資訊進行更新,并且將研究 new_list 中的 id。但是,演算法可以從 new_list 中的另一個 id 開始,所以在這種情況下,演算法應該檢查 id 是否有來自“new_list”的孩子,如果有,它應該首先填寫那個孩子的資訊,然后回傳到 id有問題。例如,如果我們首先檢查,Y那么我們應該檢查它的孩子是Z. 如果Zdf 中的值沒有被填充,我們應該先填充它,然后檢查Y. 如果Z還沒有被填充,那么我們應該檢查它的孩子,看看它們是否被填充,等等。任何幫助,將不勝感激。
uj5u.com熱心網友回復:
下面的代碼有效,但讓我解釋一下我做了什么使它作業。
首先,結構與您的相似:我使用 for 回圈來回圈new_list. 然后我檢查是否需要應用規則 1,是否需要應用else規則 2 或 3。對于規則 2,我檢查是否只有一個孩子以及孩子是否不在new_list。對于規則 3,需要不止一個孩子在那里,并且所有孩子都需要不在new_list。
然后規則 4 的技巧是使用 while 回圈:執行規則 123,然后再次計算new_list. 如果此串列的長度大于零。我們再次執行規則 123,再次更新我們的資料框。
在第一個回圈中,孩子J并G獲得了他們的價值。
第二個回圈,孩子Z得到了他的價值。
最后,孩子Y得到了價值。
new_list = list(df.id[df.test1.isnull()])
while len(new_list) > 0:
for i in new_list:
if str(dic1[i][0]) == 'nan': # rule 1
df.loc[df.id == i, 'test1'] = 0
else:
if dic1[i][1] == 1:
kid = dic1[i][0][0]
if kid not in new_list: # rule 2
df.loc[df.id == i, 'test1'] = df.test1[df.id == kid].values[0]
else:
kids = dic1[i][0]
if all(kid not in new_list for kid in kids): # rule 3
max_value = df.test1[df.id.isin(kids)].max()
df.loc[df.id == i, 'test1'] = max_value
new_list = list(df.id[df.test1.isnull()])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517862.html
