2017-07-24 108 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填充不会发生在你的实际使用中。