FutureWarning:元素比较失败;返回标量

时间:2016-04-14 10:19:02

标签: python pandas

我收到警告,我想检查一下是否会破坏。我在很多情况下使用这样的np.where(对我来说,类似于excel中的if语句)。是否有更好或更多的pythonic或pandas方法来做到这一点?我试图将一个维度变成我可以轻松进行数学运算的东西。

df['closed_item'] = np.where(df['result']=='Action Taken', 1, 0)

FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  result = getattr(x, name)(y)


INSTALLED VERSIONS
------------------
python: 3.5.1.final.0
python-bits: 64
OS: Windows
OS-release: 10

pandas: 0.18.0
nose: 1.3.7
pip: 8.1.0
setuptools: 20.2.2
Cython: 0.23.4
numpy: 1.11.0
scipy: 0.17.0
statsmodels: 0.6.1
xarray: None
IPython: 4.0.0
sphinx: 1.3.1
patsy: 0.4.0
dateutil: 2.4.2
pytz: 2015.7
blosc: None
bottleneck: None
tables: 3.2.2
numexpr: 2.5.1
matplotlib: 1.5.1
openpyxl: 2.2.6
xlrd: 0.9.4
xlwt: 1.0.0
xlsxwriter: 0.7.7
lxml: 3.4.4
bs4: 4.4.1
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.9
pymysql: None
psycopg2: None
jinja2: 2.8
boto: 2.38.0

3 个答案:

答案 0 :(得分:2)

当比较数据集中的“ int”和“ str”时,将发生此警告。将.astype(int)添加到比较数据集中。 试试:

df['closed_item'] = np.where(df['result'].astype(str)=='Action Taken', 1, 0)

答案 1 :(得分:0)

我认为您可以尝试其他替代方案 - 与numpy in1dstr.contains进行比较,但对我而言,所有3种方法都运行良好(但我的python: 2.7.11.final.0pandas: 0.18.0numpy: 1.10.4):

print df
                      result
0               Action Taken
1  Action Taken Action Taken
2                     Action
3             Something else

print df['result']=='Action Taken'
0     True
1    False
2    False
3    False
Name: result, dtype: bool

print np.in1d(df['result'],'Action Taken')
[ True False False False]

print df['result'].str.contains('Action Taken')
0     True
1     True
2    False
3    False
Name: result, dtype: bool

df['closed_item'] = np.where(df['result']=='Action Taken', 1, 0)
df['closed_item1'] = np.where(np.in1d(df['result'],'Action Taken'), 1, 0)
df['closed_item2'] = np.where(df['result'].str.contains('Action Taken'), 1, 0)
print df
                      result  closed_item  closed_item1  closed_item2
0               Action Taken            1             1             1
1  Action Taken Action Taken            0             0             1
2                     Action            0             0             0
3             Something else            0             0             0

答案 2 :(得分:0)

您提到的问题实际上非常复杂,所以让我用您的话语将其分为几部分:

  

我收到警告,我想检查是否会中断

Warning是一条语句,告诉您在处理编码逻辑时要格外小心。精心设计的警告不会破坏您的代码。如果是这样,它将是Exception

尽管您需要担心输出或性能是否有问题,但通常您可能会忽略警告 ceteris paribus 。因此,在您的情况下,如果其他一切正常,并且您不打算更新软件,则无需执行任何操作来抑制该警告。但是,如果需要,可以使用以下代码段:

import warnings
with warnings.catch_warnings():
    warnings.filterwarnings('ignore', r'elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison(.*)')
  

在很多情况下,我都像这样使用np.where(对我来说,它类似于excel中的if语句)。

请注意,熊猫中有一种DataFrame.where方法。

  

是否有更好或更多的pythonic或pandas方式来做到这一点?

是的,有两种方法可以使代码更像熊猫: 如果您希望获得许多能像假人一样工作的列,则可以使用

pd.get_dummies(df.result)

它将产生一个数据帧,其中包含一系列可能找到的所有可能的伪值。 如果这听起来像是一种过大的杀伤力,请放心,有多种方法可以仅选择一个这样的变量。


在熊猫中,布尔值TrueFalse通常用于对系列或数据框中的匹配项进行二进制分类,因此您可以执行以下操作:

df.closed_item = df.result == 'Action Taken'
  

我正在尝试将一维变成可以轻松进行数学运算的东西。

但是,如果您希望输出包含整数值以使其与您的整数匹配,则可以使用以下代码:

df.closed_item = (df.result == 'Action Taken'`).astype(int)

作为旁注,我认为此警告不会传播到较新的版本,即0.13及更高版本(如预期的那样,因为这是将来的警告),因此您也可以考虑进行更新。 / em>