根据来自其他数据框熊猫的信息添加列

时间:2020-01-17 13:13:01

标签: python-3.x pandas dataframe

我正在寻找本可以用for循环解决的问题的答案。
我有两个熊猫数据框:

           ind_1 ind_2 ind_3
   prod_id
A =   a        1    0      0
      a        0    1      0
      b        0    1      0
      c        0    0      1
      a        0    0      1

             a     b     c
B = ind_1   0.1   0.2   0.3
    ind_2   0.4   0.5   0.6
    ind_3   0.7   0.8   0.9

我正在寻找一种解决以下熊猫问题的方法:
我想用索引和列名映射数据框B的条目,并在数据框A中创建一个新列,因此结果将如下所示:

           ind_1 ind_2 ind_3   y 
   prod_id
A =   a        1    0      0  0.1
      a        0    1      0  0.4
      b        0    1      0  0.5
      c        0    0      1  0.9 
      a        0    0      1  0.7

有没有一种方法不使用for循环来解决此问题?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

在两个MultiIndex Series中为DataFrame使用DataFrame.stack,然后通过可调用项仅过滤1的值,通过Index.isin过滤b的值,删除第一级MultiIndex并最后添加新列-它与A的索引值对齐:

a = A.T.stack().loc[lambda x: x == 1]
b = B.stack()
b = b[b.index.isin(a.index)].reset_index(level=0, drop=True)

A['y'] = b
print (A)
         ind_1  ind_2  ind_3    y
prod_id                          
a            1      0      0  0.1
b            0      1      0  0.5
c            0      0      1  0.9

或者将DataFrame.joinDataFrame.query一起使用进行过滤,但是处理有点复杂:

a = A.stack()
b = B.stack()

s = (a.to_frame('a')
      .rename_axis((None, None))
      .join(b.swaplevel(1,0)
      .rename('b'))
      .query("a == 1")
      .reset_index(level=1, drop=True))
A['y'] = s['b']
print (A)
         ind_1  ind_2  ind_3    y
prod_id                          
a            1      0      0  0.1
b            0      1      0  0.5
c            0      0      1  0.9