是否有条件地基于另一个数据帧创建新的数据帧?

时间:2017-09-03 10:07:14

标签: python pandas dataframe

我有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]])

谢谢!

1 个答案:

答案 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