Pandas groupby拼接字符串报TypeError:预期str实例找到float如何解决
问题原因
- 报错
TypeError: sequence item 8: expected str instance, float found的核心原因是Kod pocztowy (PNA)列存在空值NaN,NaN本身属于float类型,哪怕整列的dtype是object,空值的类型仍然是float,拼接字符串时就会触发类型错误。 - 之前修改的
lambda x: ",".join(str(x))错误原因是:这里的x是分组后的Series对象,直接对x做str(x)会把整个Series的打印文本(包含索引、列名、类型信息)整体转为字符串,再按单个字符拆分拼接,自然会得到不符合预期的结果。
问题定位(可选)
如果需要确认空值的分布,可以执行以下代码快速找到异常行:
# 筛选出邮编列为空的所有行 invalid_postcode_rows = db[db['Kod pocztowy (PNA)'].isna()] print(f"空邮编行数:{len(invalid_postcode_rows)}") print(invalid_postcode_rows.head())
修复方案
方案1:直接修复lambda逻辑,单元素转字符串
把转字符串的操作作用于分组内的每个元素,而非整个Series:
db_miasto = db.groupby( ['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False )['Kod pocztowy (PNA)'].agg( # 只拼接非空的邮编,避免出现无意义的'nan'字符串 lambda x: ','.join(str(i) for i in x if pd.notna(i)) )
如果需要对同一分组内重复的邮编去重,可以调整为:
lambda x: ','.join(sorted(set(str(i) for i in x if pd.notna(i))))
方案2:预处理列类型,效率更高(适合39万行大数据量)
提前把邮编列的空值替换为空字符串,统一转为字符串类型后再分组拼接,执行速度比自定义lambda更快:
# 预处理:空值替换为空字符串,统一转为str类型 db['Kod pocztowy (PNA)'] = db['Kod pocztowy (PNA)'].fillna('').astype(str) # 分组拼接 db_miasto = db.groupby( ['Województwo', 'Powiat', 'Gmina', 'Miejscowość (GUS)', 'Kod gminy', 'Kod miejscowości'], as_index=False )['Kod pocztowy (PNA)'].agg(','.join)
内容的提问来源于stack exchange,提问作者Kacper Dzida
相关产品推荐
相关产品推荐

