【问题标题】:Function not being applied properly on a pandas dataframe函数未正确应用于 pandas 数据帧
【发布时间】:2026-01-24 12:50:02
【问题描述】:

我对整个 pandas 和 numpy 世界都很陌生。我有使用 python 的经验,但没有这方面的经验。我正在尝试使用数据集,但发现了一个我无法解释的问题。如果有经验的人帮助我了解其中出了什么问题,那就太好了。

我有一个包含三个字段的 CSV 文件。 “年龄”、“工薪阶层”和“收入”。标题丢失了,所以我以以下方式加载了 CSV -

import numpy as np
import pandas as pd

df = pd.read_csv("test.csv", index_col=False, header=None, names=["age", "workclass", "income"])

现在最后一列中的数据采用这种格式 - “50K”。我想根据上面的值将数据转换为“0”或“1”。因此,“50K”为 1。为此,我编写了这行代码

def test_func(x):
    if x == "<=50K":
        return "0"
    else:
        return "1"

df['income'] = df['income'].apply(test_func)

这使得所有列都变为“1”!我在 test_func 中做了一些打印,看起来 x 具有正确的值,并且 x 的类型是“str”。我无法理解,在这种情况下,为什么总是执行“else”部分而不是“if”部分。我究竟做错了什么?

我忽略了这可能是一个非常愚蠢的错误。我不确定,任何帮助都会很棒

提前致谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    选项 1
    astype

    df['income'] = df['income'].eq("<=50K").astype(int)
    

    选项 2
    np.where

    df['income'] = np.where(df.income == "<=50K", 1, 0)
    

    【讨论】:

    • 我使用了第二种方法,因为我发现我的字段值前面有空格,这就是为什么我原来的应用比较也失败了。我找不到使用第一种方法剥离字符串的方法。但是对于第二个df['income'] = np.where(df.income.str.strip() == "&lt;=50K", 1, 0) 来说,效果很好。谢谢大家的回答。这让我上了一堂关于熊猫的好课。
    【解决方案2】:

    我会这样做:

    df.loc[df['income']=='<=50K','income'] = 0
    df.loc[df['income']!='<=50K','income'] = 1
    

    【讨论】:

      【解决方案3】:

      Alex 的解决方案是经典的,但是 numpy 中有一个内置的 if/this 函数,叫做 np.where。我不是很熟悉它,但它看起来像......

      df['income'] = np.where((df['income']=='<=50K','income'), 1 ,0)
      

      Referenced np.where * Question

      【讨论】:

      • @cᴏʟᴅsᴘᴇᴇᴅ 不太确定如何使用它,但感觉它是工作的功能!感谢您提供正确的使用方法。
      最近更新 更多