【问题标题】:DataFrame objects are mutable thus they cannot be hashed while using Series.unique()DataFrame 对象是可变的,因此在使用 Series.unique() 时它们不能被散列
【发布时间】:2018-11-25 04:32:59
【问题描述】:

我在 Titanic 数据框中使用 Series.unique() 时遇到问题。

虽然在原始 df 中使用 Series.unique() 不会出错,但在基于特定列连接训练和测试时,然后使用 Series.unique() 会出错。

根据我的尝试,这是由替换第 5 条语句中的空值引起的。如果我注释掉该行,则代码可以正常工作而不会出现任何错误。为什么会这样?还有什么解决方法吗?

cat_cols = ['Pclass', 'Sex', 'Embarked']
df_train = pd.read_csv('train.csv')
df_pred = pd.read_csv('test.csv')
df_join = pd.concat([df_train[cat_cols], df_pred[cat_cols]])
df_join = df_join.fillna(df_join.mode, axis=0)
df_join.Embarked.unique()

训练和测试文件可以从以下位置下载:

https://www.kaggle.com/c/titanic/download/test.csv https://www.kaggle.com/c/titanic/download/train.csv

我目前使用的是 Pandas 版本 0.23.4

【问题讨论】:

  • 连接后的索引似乎有问题。索引中的一些数字被使用了 2 次,并且出现了散列问题。索引从 0:len(df_train) 开始,然后再次从 0:len(df_pred) 开始。

标签: python python-3.x pandas data-processing


【解决方案1】:

给定:

cat_cols = ['Pclass', 'Sex', 'Embarked']
df_train = pd.read_csv('train.csv')
df_pred = pd.read_csv('test.csv')
df_join = pd.concat([df_train[cat_cols], df_pred[cat_cols]])

NaN 值仅出现在 Embarked 列中,可以从下面的代码中验证:

df_join.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 1309 entries, 0 to 417
Data columns (total 3 columns):
Pclass      1309 non-null int64
Sex         1309 non-null object
Embarked    1307 non-null object
dtypes: int64(1), object(2)
memory usage: 80.9+ KB

因此,将NaN 替换为Embarked 列值的模式:

df_join.Embarked = df_join.Embarked.fillna(df_join.Embarked.mode()[0])
df_join.Embarked.value_counts().sum()
# 1309

并寻找独特的价值:

df_join.Embarked.unique()
# array(['S', 'C', 'Q'], dtype=object)

提示:不是mode,而是mode()[0]

希望我回答了您的问题,如果没有评论您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多