2015-12-29 57 views
2

這裏是一個簡短的表格。Python 2.7大熊貓填補缺失的數字/系列

ID,NUMBER,DEVICE 
A,103,L 
A,104,L 
B,101,L 
B,102,D 
C,101,V 
C,102,V 
C,103,L 
C,104,L 

這裏的目標是爲每個唯一的「ID」輸出「DEVICE」模式。在「數字」列中應該總共有4個數字:101,102,103,104。如果缺少任何「NUMBER」列,我們在「DEVICE」列中填寫「N」。例如,編號101和102中缺少「A」的ID,所以我們想要以下列方式填入:

ID,NUMBER,DEVICE 
A,101,N 
A,102,N 
A,103,L 
A,104,L 

的這裏的目標是輸出爲每個唯一的「ID」的「設備」圖案。因此,通過在「DEVICE」列中填寫必要的「N」,我們希望通過使用「groupby」來獲得像這樣的輸出:

{「A,NNLL」,「B,LDNN」,「C, VVLL「}

任何大師可以幫助關於第一個缺少值填充? Python熊貓的方式更受歡迎!

回答

2

這裏是一個單行(實際上是八行,但爲了便於閱讀而打破)。您請求的輸出無效:它既不是列表也不是字典。我已經將內容作爲字典導出,但如果您願意,可以執行列表格式。

>>> {key: "".join(value) 
    for key, value in 
    df 
    .pivot(index='ID', columns='NUMBER', values='DEVICE') 
    .fillna('N') 
    .T 
    .to_dict('list') 
    .iteritems()} 
{'A': 'NNLL', 'B': 'LDNN', 'C': 'VVLL'} 

解決方案的主要部分是數據透視表,在這裏我們填補缺失值與N

>>> df.pivot(index='ID', columns='NUMBER', values='DEVICE').fillna('N') 
NUMBER 101 102 103 104 
ID      
A  N N L L 
B  L D N N 
C  V V L L 

這基本上得到我們想要的數據,現在我們只需要重新構造它。如果我們撥打以上df2輸出,則:

result_dict = df2.T.to_dict('list') 
>>> result_dict 
{'A': ['N', 'N', 'L', 'L'], 
'B': ['L', 'D', 'N', 'N'], 
'C': ['V', 'V', 'L', 'L']} 

這反過來,可以使用字典理解結合在一起:

result_dict2 = {key: "".join(value) for key, value in result_dict.iteritems()} 
>>> result_dict2 
{'A': 'NNLL', 'B': 'LDNN', 'C': 'VVLL'} 

或者,你可以使用列表理解:

result3 = [key + ", " + "".join(value) for key, value in result_dict.iteritems()] 
>>> result3 
['A, NNLL', 'C, VVLL', 'B, LDNN'] 
+0

哦,我的budda,這是骯髒的! – Chubaka

+0

這有什麼不好?這只是更長時間解釋的精簡版本。 – Alexander

+0

這意味着它是一個非常乾淨的解決方案! – Chubaka