我有2个数据帧:
dfA=pd.DataFrame([[1,2,3],[4,5,6]])
dfB=pd.DataFrame([[True,False,False],[False,True,False]])
如何基于相同的索引创建新的数据框
2 ** (dfA+1) only if dfB is true
2 ** (dfA) only if dfB is false.
我想要实现的是数据帧:
df_output = pd.DataFrame([[4,4,8],[16,64,64]])
谢谢!
答案 0 :(得分:1)
您可以使用DataFrame.mask:
(2 ** dfA).mask(dfB, 2 ** (dfA+1))
Out:
0 1 2
0 4 4 8
1 16 64 64
这将检查dfB,如果为True,则从原始DataFrame((2 ** dfA)
)获取值,如果为false,则从另一个(2 ** (dfA+1)
)获取值。
这类似于numpy的功能:
np.where(dfB, 2 ** (dfA+1), 2 ** (dfA))
Out:
array([[ 4, 4, 8],
[16, 64, 64]])
但是,它会丢失索引和列,因此您可能需要将结果包装在DataFrame构造函数中:
pd.DataFrame(np.where(dfB, 2 ** (dfA+1), 2 ** (dfA)), dfA.index, dfA.columns)
Out:
0 1 2
0 4 4 8
1 16 64 64