首页 文章

Pandas:替换数据帧中的列值

提问于
浏览
71

我正在尝试替换数据帧的一列中的值 . 列(“女性”)仅包含“女性”和“男性”的值 .

我尝试过以下方法:

w['female']['female']='1'
w['female']['male']='0'

但是收到以前结果的完全相同的副本 .

理想情况下,我希望得到一些类似于以下循环元素的输出 .

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

我查看了陷阱文档(http://pandas.pydata.org/pandas-docs/stable/gotchas.html),但无法弄清楚为什么没有发生 .

任何帮助将不胜感激 .

10 回答

  • 23
    w.female.replace(to_replace=dict(female=1, male=0), inplace=True)
    

    pandas.DataFrame.replace() docs .

  • 12

    轻微变化:

    w.female.replace(['male', 'female'], [1, 0], inplace=True)
    
  • 0

    这应该也有效:

    w.female[w.female == 'female'] = 1 
    w.female[w.female == 'male']   = 0
    
  • 138

    如果我理解正确,你想要这样的东西:

    w['female'] = w['female'].map({'female': 1, 'male': 0})
    

    (这里我将值转换为数字而不是包含数字的字符串 . 如果你真的想要,你可以将它们转换为 "1""0" ,但我想要那样 . )

    你的代码不起作用的原因是因为在列上使用 ['female']w['female']['female'] 中的第二个 'female' )并不意味着"select rows where the value is 'female'" . 这意味着选择索引为'female'的行,其中DataFrame中可能没有任何行 .

  • 77

    您可以使用loc编辑数据框的子集:

    df.loc[<row selection>, <column selection>]
    

    在这种情况下:

    w.loc[w.female != 'female', 'female'] = 0
    w.loc[w.female == 'female', 'female'] = 1
    
  • 21

    你也可以使用 apply.get

    w['female'] = w['female'].apply({'male':0, 'female':1}.get)

    w = pd.DataFrame({'female':['female','male','female']})
    print(w)
    

    Dataframe w

    female
    0  female
    1    male
    2  female
    

    使用 apply 替换字典中的值:

    w['female'] = w['female'].apply({'male':0, 'female':1}.get)
    print(w)
    

    结果:

    female
    0       1
    1       0
    2       1
    

    如果数据框中列的所有可能值都在字典中定义,则应使用带有字典的 Note: apply ,对于未在字典中定义的那些,它将为空 .

  • 8

    另外,还有内置函数pd.get_dummies用于这些类型的赋值:

    w['female'] = pd.get_dummies(w['female'],drop_first = True)
    

    这为您提供了一个包含两列的数据框,每个列对应于w ['female']中出现的每个值,其中您放弃第一列(因为您可以从剩下的那个中推断出它) . 新列将自动命名为您替换的字符串 .

    如果您的分类变量具有两个以上的可能值,则此功能尤其有用 . 此函数创建区分所有情况所需的虚拟变量 . 请注意,不要将整个数据框分配到单个列,而是如果w ['female']可以是“男性”,“女性”或“中性”,请执行以下操作:

    w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
    w.drop('female', axis = 1, inplace = True)
    

    然后你会留下两个新的列给你一个“女性”的虚拟编码,然后你用字符串去除了列 .

  • 5

    这非常紧凑:

    w['female'][w['female'] == 'female']=1
    w['female'][w['female'] == 'male']=0
    

    另一个好的:

    w['female'] = w['female'].replace(regex='female', value=1)
    w['female'] = w['female'].replace(regex='male', value=0)
    
  • 1

    pandas 中还有一个名为factorize的函数,您可以使用它自动执行此类工作 . 它将标签转换为数字: ['male', 'female', 'male'] -> [0, 1, 0] . 有关更多信息,请参阅this answer .

  • 4

    我认为应该指出在上面建议的所有方法中你会得到哪种类型的对象:是Series还是DataFrame .

    当您通过 w.female.w[[2]] (其中,假设,2是您的列号)获得列时,您将返回DataFrame . 因此,在这种情况下,您可以使用 .replace 之类的DataFrame方法 .

    当您使用 .lociloc 时,您将返回Series,而Series没有 .replace 方法,因此您应该使用 applymap 等方法 .

相关问题