我正在寻找本可以用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循环来解决此问题?
提前谢谢!
答案 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.join
与DataFrame.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