You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算DataFrame列间共同名称数量时遭遇AttributeError:'float' object has no attribute 'astype'问题求助

解决DataFrame列中共同名称统计的AttributeError问题

我来帮你搞定这个报错问题!你遇到的AttributeError: 'float' object has no attribute 'astype',核心原因是数据里的缺失值(NaN)在df.values中会以float类型存在,而float对象根本没有astype方法,直接调用自然会报错。另外,直接用索引x[8]、x[10]取列不仅不直观,还容易因为列顺序变动出错,我们换一种更安全清晰的方式来处理:

修正后的完整代码

import pandas as pd

filepath = "C:/Users/data/Untitled Folder/creditdata2.csv"
df = pd.read_csv(filepath, encoding='utf-8')

# 1. 处理目标列:转为字符串,把NaN替换为空字符串
col8 = df.iloc[:, 8].astype(str).replace('nan', '')
col10 = df.iloc[:, 10].astype(str).replace('nan', '')

# 2. 定义函数计算每行的名称交集(自动处理空格和空值)
def count_overlap(row):
    # 拆分字符串为集合,同时去掉名称前后的空格,过滤空字符串
    set_col8 = set(name.strip() for name in row[0].split(",") if name.strip())
    set_col10 = set(name.strip() for name in row[1].split(",") if name.strip())
    return set_col8 & set_col10

# 3. 逐行计算交集
df['word_overlap'] = pd.concat([col8, col10], axis=1).apply(count_overlap, axis=1)

# 4. 统计交集数量
df['overlap_count'] = df['word_overlap'].apply(len)

# 5. 保存结果
df.to_csv('creditdata3.csv', mode='a', index=False)

关键细节说明

  1. 为什么放弃df.values遍历?
    df.values返回的是numpy数组,缺失值会被强制转为float类型的NaN,而我们直接对DataFrame列处理时,用astype(str)会把NaN转为字符串"nan",再替换为空字符串,彻底避免了float类型的报错。

  2. 为什么要处理空格?
    你的数据里有类似"Anakin Ana, Chris Cannon"的格式,拆分后会得到["Anakin Ana", " Chris Cannon"],带空格的名称会被集合当成不同元素,所以用name.strip()去掉前后空格,保证同名元素能被正确识别。

  3. 为什么过滤空字符串?
    如果某一行的列是空值(或被转为空字符串),split(",")会得到[""],这个空字符串会污染集合,所以用if name.strip()过滤掉无效的空元素。

测试验证(用你提供的示例数据)

df_test = pd.DataFrame(
    {'a': ['Anakin Ana', 'Anakin Ana, Chris Cannon', 'Chris Cannon', 'Bella Bold'], 
     'b': ['Bella Bold, Chris Cannon', 'Donald Deakon', 'Bella Bold', 'Bella Bold'], 
     'c': ['Chris Cannon', 'Chris Cannon, Donald Deakon', 'Chris Cannon', 'Anakin Ana, Bella Bold']}, 
    index=[0,1,2,3]
)

# 用a和b列测试逻辑
col_a = df_test['a'].astype(str).replace('nan', '')
col_b = df_test['b'].astype(str).replace('nan', '')

df_test['word_overlap'] = pd.concat([col_a, col_b], axis=1).apply(count_overlap, axis=1)
df_test['overlap_count'] = df_test['word_overlap'].apply(len)

print(df_test[['a','b','word_overlap','overlap_count']])

输出结果:

a                     b       word_overlap  overlap_count
0                Anakin Ana  Bella Bold, Chris Cannon                 {}              0
1  Anakin Ana, Chris Cannon          Donald Deakon                 {}              0
2              Chris Cannon            Bella Bold                 {}              0
3               Bella Bold            Bella Bold  {Bella Bold}              1

内容的提问来源于stack exchange,提问作者reresearchgames

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 22:24:07