2017-07-24 105 views
0

我有數據框和數據透視表,我需要從pivot_table的列中替換數據框中的一些值。熊貓:從pivot_table替換數據幀中的值

數據幀:

 access_code        ID cat1 cat2 cat3 
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1 2    

g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 1 2    

g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 1 2    

g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1     

g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3 

透視表:

type                1  2                            \ 
access_code  ID        member_id   
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1045794  1023 923          1     122  
g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 768656   203 243        1     169 
g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 604095   392 919        1     35 
g06q0itlmkqmz5cv f4a3b3f2fca77c443cd4286a4c91eedc 1457307  243       1      
g074qx58cmuc1a2f 13f2674f6d5abc888d416ea6049b57b9 5637836          1      
g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 5732738  111  2343        1      

慾望輸出:

 access_code        ID cat1 cat2 cat3 
g1gw8bzwelo83mhb 0433a3d29339a4b295b486e85874ec66 1023 923    

g0dgzfg4wpo3jytg 04467d3ae60fed134077a26ae33e0eae 111 2343    

g1gwui6r2ep471ht 06e3395c0b64a3168fbeab6a50cd8f18 392 919     

g05ooypre5l87jkd 089c81ebeff5184e6563c90115186325 1     

g0ifck11dix7avgu 0d254a81dca0ff716753b67a50c41fd7 1 2 3 

如果我使用

df.ix[df.cat1 == 1] = pivot_table['1'] 

它返回錯誤ValueError: cannot set using a list-like indexer with a different length than the value

+1

「它返回錯誤。」什麼錯誤? –

+0

@JohnZwinck ValueError:不能使用與值 –

+0

「merge」然後「fillna」結尾「drop」值不同的列表式索引器設置 – Wen

回答

0

只要你的數據幀不是非常大,你可以以一些非常醜陋的方式使它發生。我相信別人會爲您提供更優雅的解決方案,但與此同時,這種膠帶可能會爲您指出正確的方向。

請記住,在這種情況下,我用2個數據幀而不是1個數據幀和1個數據透視表執行此操作,因爲我已經有足夠的格式化文本數據中數據幀的麻煩了。

由於數據中有空字段,而且我的數據框不像這樣,所以首先將空字段轉換爲零。

df = df.replace(r'\s+', 0, regex=True) 

現在確保您的數據實際上是浮動,否則比較就會失敗

df[['cat1', 'cat2', 'cat3']] = df[['cat1', 'cat2', 'cat3']].astype(float) 

而對於fizzly煙花:

df.cat1.loc[df.cat1 == 1] = piv['1'].loc[df.loc[df.cat1 == 1].index].dropna() 
df.cat1 = df.cat1.fillna(1) 

df.cat2.loc[df.cat2 == 2] = piv['2'].loc[df.loc[df.cat2 == 2].index].dropna() 
df.cat2 = df.cat2.fillna(2) 

df = df.replace(0, ' ') 

的fillna只是重現您想要的輸出,其中你顯然沒有處理一些線。我想這個逐列NaN填充不會發生在你的實際使用中。