首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy Where多个条件,不能将dtyped [object]数组与[bool]类型的标量进行比较

Numpy Where多个条件,不能将dtyped [object]数组与[bool]类型的标量进行比较
EN

Stack Overflow用户
提问于 2021-01-27 00:23:32
回答 3查看 181关注 0票数 2

我试图在numpy中执行多个条件,但得到了错误:cannot compare a dtyped [object] array with a scalar of type [bool]

下面是这行代码:

代码语言:javascript
复制
d7['CAD'] = np.where(d7['Category'] == 'Stack' & d7['Currency'] == fxratetable['from_currency'],d7['CAD'] * fxratetable['fx_rate'], d7['CAD'])

除了fx_rate是float64之外,所有的dtypes都是object

另一个想法是,我用Category = Stack查找一个值,但用我的Currency = from_currency查找多个值。

有人能帮上忙吗?

谢谢。

新错误

代码语言:javascript
复制
ValueError: Can only compare identically-labeled Series objects now. 

这是我的新声明

代码语言:javascript
复制
d7['CAD'] = np.where((d7['Category'] == 'Stack') & 
                     (d7['Currency'] == fxratetable['from_currency']),
                     d7['CAD'] * fxratetable['fx_rate'], 
                     d7['CAD'])

d7:

代码语言:javascript
复制
+--------------+----------+----------+
| CAD          | Currency | Category |
+--------------+----------+----------+
| -4350242.355 | GBP      | Stack    |
+--------------+----------+----------+
| 424223.7584  | AUD      | Stack    |
+--------------+----------+----------+

fxratetable:

代码语言:javascript
复制
+---------------+---------+
| from_currency | fx_rate |
+---------------+---------+
| GBP           | 1.367   |
+---------------+---------+
| AUD           | 0.7706  |
+---------------+---------+

需要新的CAD列。

代码语言:javascript
复制
+----------------+
| CAD (expected) |
+----------------+
| -5948957.275   |
+----------------+
| 326991.5663    |
+----------------+
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-30 07:50:27

我个人更喜欢在处理条件时使用DataFrame.apply

代码语言:javascript
复制
d7['CAD'] = d7.apply(lambda row: row.CAD * fxratetable[fxratetable.from_currency == row.Currency].fx_rate.item() \
                                 if row.Category == 'Stack' else row.CAD, axis=1)

fxratetable[fxratetable.from_currency == row.Currency]fxratetable中选择与正确货币对应的行,.fx_rate选择rate列,.item()提供数字,而不是系列。

您可以看到,只有row.Category == 'Stack'条件仍然存在,有问题的系列比较现在是选择的一部分。

最后,使用axis=1将该函数应用于DataFrame行(docu)。

我还没有进行过广泛的测试,所以请让我知道它是否有效。

票数 1
EN

Stack Overflow用户

发布于 2021-01-29 23:14:39

问题出在布尔表达式的第二部分。假设d7不只是两行,否则就不会有这个问题。d7['Currency'] == fxratetable['from_currency']逐行比较两个序列,当行耗尽fxratetable时,它不再知道要将d7与什么进行比较。

我不知道您是否设置了使用NumPy,或者您可以做的事情是否有限制,但merge语句将非常容易地处理这些问题:

代码语言:javascript
复制
# Merge the exchange rate
d7 = pd.merge(d7, fxratetable, left_on='Currency', right_on='from_currency', how='left')
# Find the rows which have a non-NaN exchange rate and multiply
d7['CAD'] = np.where(~np.isnan(d7['fx_rate']), d7['CAD']*d7['fx_rate'], d7['CAD'])
票数 1
EN

Stack Overflow用户

发布于 2021-02-02 20:09:58

我认为这将是您所期望的。我已经用一种容易理解的方式写了它。

代码语言:javascript
复制
d7 = pd.DataFrame({'CAD':[-4350242.355,424223.7584],'Currency':['GBP','AUD'],'Category':['Stack','Stack']})
fxratetable = pd.DataFrame({'from_currency':['GBP','AUD'],'fx_rate':[1.367,0.7706 ]})
_condition1 = d7['Category'] == 'Stack'
_condition2 = d7['Currency'] == fxratetable['from_currency']
d7['CAD (expected)'] = np.where(_condition1 & _condition2,d7['CAD'] * fxratetable['fx_rate'],d7['CAD'])
d7

输出

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65905132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档