Python pandas将多级列标题df映射到另一个df

时间:2017-09-25 22:10:48

标签: python pandas

我要做的是使用map函数将数据透视表绑定到另一个数据帧。 A1:A4是表示不同位置的列。因此,数据透视表中的值表示A1或A3等实例的数量

我有一个数据框和一个数据透视表。数据框(df1)如下所示:

    SubscriberKey Inst    A1   A2   A3   A4
        'abc'      2      0    0     0    0
        'bcd'      4      0    0     0    0
        'cde'      1      0    0     0    0
        'def'      0      0    0     0    0
        'efg'      0      0    0     0    0

我的数据透视表(pt1)看起来像这样。它还有一个多级列标题,因为它是一个数据透视表。澄清多级列标题的含义是单列标题输出('Instance','A1')。无论如何,下面是我的数据透视表(pt1)的快照:

     Subscriber Key Instance Instance Instance Instance
       Linkname       A1       A2       A3       A4
        'abc'          2         0       2        0
        'bcd'          4         1       1        2
        'cde'          1         1       0        0

我想以某种方式根据枢轴中的内容填充我的df的A1:A4列。 df具有比数据透视表包含的用户密钥更多的用户密钥,因此行数不相同。

输出如下:

    SubscriberKey  Inst   A1  A2   A3  A4
        'abc'       2     0    0    2   0
        'bcd'       4     0    1    1   2
        'cde'       1     1    0    0   0
        'def'       0     0    0    0   0
        'efg'       0     0    0    0   0

感谢任何帮助,谢谢!我已经尝试过df1.update(pt1 [column])并返回'Type Error:expected tuple,got str'

2 个答案:

答案 0 :(得分:1)

更新应该有效。试试这个:

df1 = df1.set_index('SubscriberKey')
df1


Output:             
             Inst   A1  A2  A3  A4
SubscriberKey                   
'abc'          1    0   0   0   0
'bcd'          2    0   0   0   0
'cde'          1    0   0   0   0
'def'          3    0   0   0   0
'efg'          0    0   0   0   0

df2 = df2[1:]
df2.columns = ["SubscriberKey","A1","A2","A3","A4"]
df2 = df2.set_index('SubscriberKey')



Output:
              A1    A2  A3  A4
SubscriberKey               
'abc'          1    0   2   0
'bcd'          0    1   1   2
'cde'          1    1   0   0

然后做:

df1.update(df2)
df1

给出:

              Inst  A1  A2  A3  A4
SubscriberKey                   
'abc'           1   1   0   2   0
'bcd'           2   0   1   1   2
'cde'           1   1   1   0   0
'def'           3   0   0   0   0
'efg'           0   0   0   0   0

答案 1 :(得分:1)

> line <- "01+0111.  02+0262.  03+1900.  04-15.68  05+64.50  06+08.82  07+1.013  08+0.943"
> gsub("\\d\\d\\+", "", line)
[1] "0111.  0262.  1900.  04-15.68  64.50  08.82  1.013  0.943"

在处理多级索引后,这也有效。有很多方法可以解决这个问题。我通常只使用.reset_index()