如何使两个数据框架一个与值和另一个与布尔成一个数据框架在python?



例如,我有两个数据框架:

dataframe1将是

A     B     C     D     E
values1  0.25  0.33  0.12  0.22  0.08
values2  0.20  0.50  0.89  0.65  0.75

和dataframe2将是

A     B     C      D     E
boolean1   True False  True  False  True
boolean2  False False  True   True  True

和想要一个数据帧的结果:

A  B     C     D     E
1  0.25  0  0.12     0  0.08  
2     0  0  0.89  0.65  0.78

因此,如果在dataframe2中为True,只需从dataframe1中获取值,如果为False,则将其替换为0。我该怎么做呢?

可以使用

df1 = df1.where(df2.values, 0)
# or
df1 = df1.mask(~df2.values, 0)
print(df1)
A    B     C     D     E
values1  0.25  0.0  0.12  0.00  0.08
values2  0.00  0.0  0.89  0.65  0.75

一种方法是将数据框中的值相乘,然后从中创建数据框。

>>> out = pd.DataFrame(df1.values * df2.values, columns=df1.columns)

A    B     C     D     E
0  0.25  0.0  0.12  0.00  0.08
1  0.00  0.0  0.89  0.65  0.75

或者你可以把数据帧相乘,去掉索引:

>>> df1.reset_index(drop=True)*df2.reset_index(drop=True)
A    B     C     D     E
0  0.25  0.0  0.12  0.00  0.08
1  0.00  0.0  0.89  0.65  0.75

如果保证两个数据框始终是相同的形状,则可以使用pandas.DataFrame.mask

创建数据

df1 = pd.DataFrame([['values1', '0.25', '0.33', '0.12', '0.22', '0.08'], ['values2', '0.20', '0.50', '0.89', '0.65', '0.75']], columns = ['index', 'A', 'B', 'C', 'D', 'E']).set_index('index')
df2 = pd.DataFrame([['boolean1', True, False,  True,  False,  True], ['boolean2',  False, False,  True,   True,  True]], columns = ['index', 'A', 'B', 'C', 'D', 'E']).set_index('index')
面具

df1.mask(~df2.values, 0)

我们得到

A  B     C     D     E
index                             
values1  0.25  0  0.12     0  0.08
values2     0  0  0.89  0.65  0.75

最新更新