【发布时间】:2020-03-17 20:38:39
【问题描述】:
我想用最常见的值,即'S'来填充titanic数据集中的一些缺失数据:
# This does not work:
df.loc[df.Embarked.isnull(), 'Embarked'] = df.Embarked.mode()
# But this does work:
df.loc[df.Embarked.isnull(), 'Embarked'] = 'S'
# And this works too:
df.loc[df.Embarked.isnull(), 'Embarked'] = str(df.Embarked.mode())
我认为这可能与不匹配的数据类型有关,所以我检查了这个:
df.Embarked.mode()
>>>
0 S
dtype: object
所以模式作为对象返回。检查 Embarked 列的数据类型,我们看到它还包含所有对象:
df.Embarked
>>>
PassengerId
1 S
2 C
3 S
4 S
5 S
..
1305 S
1306 C
1307 S
1308 S
1309 C
Name: Embarked, Length: 1309, dtype: object
现在我已经弄清楚什么是有效的,并且实施起来并不难,我只是好奇为什么显而易见的(对我而言)解决方案不起作用?
【问题讨论】:
-
df.loc[df.Embarked.isnull(), 'Embarked'] = df.Embarked.mode()[0]? -
object是列中元素的类型(pandas 调用str和object)。如果你做了type(df.Embarked.mode()),你会看到它是Series,以防你有多个模式(即没有重复)。您只需要第一个元素的值,所以@QuangHoang 所说的将起作用。 -
@E.Bassett,有趣的是,将系列转换为字符串也可以。谢谢你广黄。如果你们中的任何一个想要扩展答案,我很乐意给你一些互联网信誉。不管怎样,谢谢。
-
我很惊讶演员的工作和
str(df.Embarked.mode())没有给你像'0 PassengerId\ndtype: object'这样的东西
标签: python pandas dataframe data-structures