属性错误:'float'对象没有'split'属性。

23

我正在呼叫这条线路:

lang_modifiers = [keyw.strip() for keyw in row["language_modifiers"].split("|") if not isinstance(row["language_modifiers"], float)]

这似乎在row["language_modifiers"]是一个单词(atlas methodcentral)时有效,但当它出现为nan时则无效。

我原以为我的if not isinstance(row["language_modifiers"], float)可以捕获出现nan的情况,但事实并非如此。

背景: row["language_modifiers"]是tsv文件中的一个单元格,在解析的tsv文件中该单元格为空时会出现nan


为什么这个被踩了?只是想知道一下。你可以在我提问中包含的三个测试用例上进行测试。 - Dhruv Ghulati
2个回答

55

你说得对,这类错误通常由NaN表示的空单元格引起。在应用进一步操作之前,使用以下惯用语过滤出这样的数据,应用于你的数据框df:

df_new = df[df['ColumnName'].notnull()]

另一种更方便的方法是使用fillna()方法对null值进行替换(填充)。

例如,所有的nullNaN可以用其所在列的平均值来替换。

housing['LotArea'] = housing['LotArea'].fillna(housing.mean()['LotArea'])

或者可以被替换为一个值,比如空字符串""或另一个默认值。

housing['GarageCond']=housing['GarageCond'].fillna("")

5
您也可以使用df = df.dropna(thresh=n),其中n是公差。这意味着,需要n个非空值才能保留该行
请注意,这种方法将删除该行。
例如:如果您有一个包含5列的数据帧,则df.dropna(thresh=5)将删除任何没有5个有效或非Na值的行。
在您的情况下,您可能只想保留有效的行;如果是这样,请将阈值设置为您拥有的列数。
有关dropna的Pandas文档: 点击此处查看

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接