![](/img/trans.png)
[英]AttributeError: 'float' object has no attribute 'split' in pandas
[英]AttributeError: 'float' object has no attribute 'split' when making a generator object
print([x["keywords"].split(",") for i,x in df.iterrows() if not isinstance(x["keywords"], (int, float))])
print([x["tags"].split(",") for i,x in df.iterrows() if not isinstance(x["tags"], (int, float))])
print([x["rating"].split(",") for i,x in df.iterrows() if not isinstance(x["rating"], (int, float))])
print([x["rank"].split(",") for i,x in df.iterrows() if not isinstance(x["rank"], (int, float))])
當我將它們連接在一起時,我想將這四個語句合並為一個語句,這給了我錯誤:
AttributeError:“ float”對象沒有屬性“ split”
features = [(x["entity_id"], x["tags"].split(","),x["rating"],
x["rank"],x["keywords"].split(",") )
for (index, x) in df.iterrows() if not isinstance(x, (int, float))]
pd.DataFrame.iterrows
返回索引和pd.Series
對象的元組。 因此,由於pd.Series
對象不是int
或float
的子類,所以isinstance(x, (int, float))
並沒有做您想要的事情。 使用此方法,您將需要迭代pd.Series
對象中包含的各個值。
這是可能的,但我強烈建議不要這樣做。 實際上,我建議您完全避免iterrows
,因為它會丟失所有矢量化功能,這是Pandas的主要優點之一。
這是使用pd.DataFrame.mask
和NumPy數組的解決方案:
df = pd.DataFrame({'entity_id': ['SomeId', 3124123, 'SomeOtherId', 314324],
'tags': ['Tag1,Tag2', None, 'Tag4', 'Tag5,Tag6,Tag7'],
'rating': [5.0, 'SomeRating', 'SomeOtherRating', np.nan],
'rank': ['SomeRank', 2, np.nan, 4],
'keywords': ['key1', 'key2,key3', 'key4', 'key5']})
df2 = df.mask(df.apply(pd.to_numeric, errors='coerce').notnull() | df.isnull(), None)
for col in ['tags', 'keywords']:
df2[col] = df2[col].str.split(',')
col_order = ['entity_id', 'tags', 'rating', 'rank', 'keywords']
res = [list(filter(None, x)) for x in df2[col_order].values.tolist()]
結果
print(res)
[['SomeId', ['Tag1', 'Tag2'], 'SomeRank', ['key1']],
['SomeRating', ['key2', 'key3']],
['SomeOtherId', ['Tag4'], 'SomeOtherRating', ['key4']],
[['Tag5', 'Tag6', 'Tag7'], ['key5']]]
作為評論,這很混亂。 優良作法是確定一致的結構,而不是這種混合的數據類型結構和基於類型的過濾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.