2017-09-03 141 views
0

我有2個dataframes這樣:基於另一個數據框創建新的有條件數據框?

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

您可以使用DataFrame.mask:

(2 ** dfA).mask(dfB, 2 ** (dfA+1)) 
Out: 
    0 1 2 
0 4 4 8 
1 16 64 64 

這將檢查DFB,如果屬實,從原來的數據框((2 ** dfA)),如果假的取值,從另一個(2 ** (dfA+1))取值。

這類似於numpy的是其中功能:

np.where(dfB, 2 ** (dfA+1), 2 ** (dfA)) 
Out: 
array([[ 4, 4, 8], 
     [16, 64, 64]]) 

然而,失去了索引和列,所以你可能需要包裝的結果在數據幀的構造函數:

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 
+0

完美。感謝您的解答和解釋! – smallcat31

相關問題