【问题标题】:Python - 'TypeError: '<=' not supported between instances of 'str' and 'int''Python - 'TypeError:'str'和'int'的实例之间不支持'<=''
【发布时间】:2018-12-17 08:13:50
【问题描述】:

我有一个值从 -5 到 10 的 df 列。我想将值 negative,将所有 0 值更改为 neutral,并将所有值 >= 1 更改为 positive .但是,下面的代码会为“否定”产生以下错误。

# Function to change values to labels

test.loc[test['sentiment_score'] > 0, 'sentiment_score'] = 'positive'
test.loc[test['sentiment_score'] == 0, 'sentiment_score'] = 'neutral'
test.loc[test['sentiment_score'] < 0, 'sentiment_score'] = 'negative'

Data:                                  Data After Code:
Index     Sentiment                    Index     Sentiment
 0         2                            0         positive
 1         0                            1         neutral
 2        -3                            2         -3
 3         4                            3         positive
 4        -1                            4         -1
 ...                                    ...
 k         5                            k         positive

文件“pandas_libs\ops.pyx”,第 98 行,在 pandas._libs.ops.scalar_compare TypeError:“str”和“int”实例之间不支持“

我认为这与将负数视为字符串而不是浮点数/整数的函数有关,但是我尝试了以下代码来纠正此错误,但它没有任何改变。任何帮助将不胜感激。

test['sentiment_score'] = test['sentiment_score'].astype(float)
test['sentiment_score'] = test['sentiment_score'].apply(pd.as_numeric)

【问题讨论】:

  • 你试过float(test['sentiment_score']) &gt; 0吗?
  • @Joel 我希望不会,因为那是完全错误的
  • 负数不被视为字符串。您将分 3 部分进行更换。当您到达test.loc[test['sentiment_score'] == 0, 'sentiment_score'] = 'neutral' 时,您已经从test.loc[test['sentiment_score'] &gt; 0, 'sentiment_score'] = 'positive' 向该列添加了大量字符串
  • @roganjosh 不错!
  • 我想你最好创建一个新列来保存分类数据

标签: python pandas


【解决方案1】:

另一种选择是定义一个自定义函数:

def transform_sentiment(x):
    if x < 0:
        return 'Negative'
    elif x == 0:
        return 'Neutral'
    else:
        return 'Positive'

df['Sentiment_new'] = df['Sentiment'].apply(lambda x: transform_sentiment(x))

【讨论】:

    【解决方案2】:

    正如 roganjosh 指出的那样,您分 3 步进行替换 - 这会导致问题,因为在第 1 步之后,您最终会得到一列混合 dtypes,因此后续的相等性检查开始失败。

    您可以分配给新列,也可以使用numpy.select

    condlist = [
       test['sentiment_score'] > 0,
       test['sentiment_score'] < 0
    ]
    choicelist = ['pos', 'neg']
    
    test['sentiment_score'] = np.select(
       condlist, choicelist, default='neutral')
    

    【讨论】:

    • 我在尝试您的回答时遇到此错误:TypeError: select() got multiple values for argument 'default'
    • 谢谢大家,帮了大忙。我最终使用了 RoganJosh 的解决方案,即创建一个新列来添加分类数据,但这也很有效,而且更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多