例如,我有两个数据框架:
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