【问题标题】:Pandas does not change categorical data [sex] to numerical values [0/1]Pandas 不会将分类数据 [sex] 更改为数值 [0/1]
【发布时间】:2019-09-29 14:45:24
【问题描述】:

我正在尝试处理泰坦尼克号数据集。我想将 Sex 列转换为二进制值。这是我的尝试:

sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)

当我尝试print(sex)时,控制台输出None!

我也尝试在 SO 上实施其他方法,但它们似乎都不起作用。以下是我的完整源代码:

import pandas as pd
from numpy import corrcoef

train_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

survived = train_dataset['Survived']
pClass = train_dataset['Pclass']

#Doesn't work
sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)

age = train_dataset['Age']
fare = train_dataset['Fare']
parch = train_dataset['Parch']
sibSp = train_dataset['SibSp']

# print("Correlation between parent-children & survival is: " + str(corrcoef(survived, parch)))
# print("Correlation between age & survival is: " + str(corrcoef(survived, age)))
# print("Correlation between Siblings/Spouse & survival is: " + str(corrcoef(survived, sibSp)))

print(sex)

【问题讨论】:

  • 您正在使用选项inplace=True,这会更改train_dataset 实例,而不是返回值。现在您知道使用inplace=True 时不会返回任何值,您就会明白sex 应该等于None,因为没有任何返回
  • 谢谢@KenHBS 在理查德发布他的答案之前我已经注意到了。尽管如此,我还是感谢您的帮助。我赞成你的评论。如果您认为这是一个很好的问题,您能否也给我一个赞成票?

标签: python pandas machine-learning categorical-data kaggle


【解决方案1】:

这里有两个问题,第一,你把.replace(<replace_this>, <with_this>)中的论点转了过来。其次,您正在使用选项inplace=True。这会更改 train_dataset 实例,而不是返回值。

既然您知道使用inplace=True 时不会返回任何值,您就会明白sex 应该等于None,因为没有任何返回:

>>> import pandas as pd
>>> df = pd.DataFrame({'a': ['male', 'female', 'female', 'male']})
>>> df
        a
# 0    male
# 1  female
# 2  female
# 3    male

没有replace=True:

现在当我们替换值时,我们会得到

>>> df.replace(['female', 'male'], [0,1])
# a
# 0  1
# 1  0
# 2  0
# 3  1

但是df 本身看起来还是和之前一模一样:

>>> df
        a
#  0    male
#  1  female
#  2  female
#  3    male

所以为了替换df 中的值,我们会这样做:

>>> df['a'] = df['a'].replace(['male', 'female'], [0,1])
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

与replace=True:

当您运行此代码时:df.replace(['female', 'male'], [0, 1], inplace=True)),您将立即获得 df 的操纵版本:

>>> df.replace(['female', 'male'], [0, 1], inplace=True)
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

注意inplace=True 参数使得没有返回值:

>>> test = df.replace(['female', 'male'], [0, 1], inplace=True)
>>> type(test)
# <class 'NoneType'>

【讨论】:

    【解决方案2】:

    试试:

    sex = train_dataset['Sex'].replace(['female','male'],[0,1])
    print(sex)
    

    您的语法似乎已关闭。见replace function

    输出:

    【讨论】:

      【解决方案3】:

      您可以使用np.where

      dataset['sex']=np.where(dataset['sex']=='female',0,1)
      

      【讨论】:

      • 你怎么不查dataset['sex']=='male'?
      • 男性默认被分配一个 1。你也可以这样 np.where(dataset['sex']=='male',1,0) 也应该工作并产生相同的输出。
      • 啊,好吧。说得通。不幸的是,我已经接受了理查德的回答,但出于对您的努力的赞赏,我确实支持了您。如果您认为这是一个很好的问题,您能否也给我一个赞成票?
      • 你也可以试一试(实际上是同样的逻辑;))train_dataset['Sex'].eq('male').astype(int)@oo92
      【解决方案4】:

      参数官方文档:

      inplace : bool,默认 False 如果为 True,则就地。注意:这将 修改此对象上的任何其他视图(例如,来自 数据帧)。如果为 True,则返回调用者。

      总而言之,inplace=True 返回 None,inplace=False 返回执行操作的对象副本。

      因此,在您的情况下,由于操作是 inplace=True,因此修改了原始系列对象 train_dataset['Sex']。操作后尝试打印train_dataset,应该会看到修改后的数据框。

      参考官方文档here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-01
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 2020-10-22
        • 2019-04-26
        • 1970-01-01
        相关资源
        最近更新 更多