【问题标题】:Pandas condition does not work on a selected row value by (.loc)Pandas 条件不适用于 (.loc) 选定的行值
【发布时间】:2022-01-02 09:39:42
【问题描述】:

我有这个例子 df:

df6 = pd.DataFrame({
                   'answer1': ['UK', 'Paris', 'Toronto'],
                   'answer2': ['Paris', 'Paris', 'Paris'],
                   'answer3': ['CA', 'CA', 'CA'],
                   'correct': [0.4, '3.1', 'Answer3']
                   })

df6:

    answer1    answer2  answer3 correct
0    UK         Paris     CA    0.4
1    Paris      Paris     CA    3.1
2    Toronto    Paris     CA    Answer3

根据 Answer1 列是 Toronto 的条件,我想将正确列中的文本“Answer3”替换为 3。

所以,我创建了一个函数,然后在 answer1 == Toronto 时使用 apply:

def replace_answer(text):
    return text.replace("Answer", "")

df6.loc[df6['answer1'] == 'Toronto', 'correct'] = df6['correct'].apply(lambda x : replace_answer(x))

我收到以下错误:AttributeError: 'float' object has no attribute 'replace'

为什么我的代码处理所有正确的列,而我只选择包含多伦多作为条件的单元格?

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    代码df6['correct'].apply(...) 应用于整个列,所以你得到了错误

    df6.loc[df6['answer1'] == 'Toronto', 'correct'] 只是关于索引的结果将去往的地方


    在两边都使用过滤器

    df6.loc[df6['answer1'] == 'Toronto', 'correct'] = \
        df6.loc[df6['answer1'] == 'Toronto', 'correct'].apply(lambda x: replace_answer(x))
    

    如果你想把all转成float,把all传给方法,可以让方法处理

    def replace_answer(text):
        """ Remove all non-digit/non-dot """
        return float(re.sub(r"[^\d.]", "", str(text)))
    
    df6['correct'] = df6['correct'].apply(replace_answer)
    print(df6)
    

    【讨论】:

      【解决方案2】:

      因为你在应用整个df6的apply函数。

      你应该这样做:

      df6.loc[df6['answer1'] == 'Toronto', 'correct'] = df6.loc[df6['answer1'] == 'Toronto', 'correct'].apply(lambda x : replace_answer(x))
      

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 2021-03-04
        • 2016-02-19
        • 1970-01-01
        • 2020-05-24
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        相关资源
        最近更新 更多