Pandas:从pivot_table替换dataframe中的值

时间:2017-07-24 13:48:09

标签: python pandas

我有数据框和数据透视表,我需要在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 :(得分:0)

只要您的数据框架不是很大,您就可以以一些非常丑陋的方式实现它。我相信其他人会为您提供更优雅的解决方案,但与此同时,此胶带可能会指向您正确的方向。

请记住,在这种情况下,我使用2个数据帧而不是1个数据帧和1个数据透视表执行此操作,因为我已经在从文本数据格式化数据帧时遇到了足够的麻烦。

由于您的数据中有空字段且我的数据框架不喜欢这样,因此首先将空字段转换为零。

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

现在确保您的数据实际上是浮动的,否则比较将失败

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

对于烟火爆竹:

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