计算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)
关键细节说明
为什么放弃
df.values遍历?df.values返回的是numpy数组,缺失值会被强制转为float类型的NaN,而我们直接对DataFrame列处理时,用astype(str)会把NaN转为字符串"nan",再替换为空字符串,彻底避免了float类型的报错。为什么要处理空格?
你的数据里有类似"Anakin Ana, Chris Cannon"的格式,拆分后会得到["Anakin Ana", " Chris Cannon"],带空格的名称会被集合当成不同元素,所以用name.strip()去掉前后空格,保证同名元素能被正确识别。为什么过滤空字符串?
如果某一行的列是空值(或被转为空字符串),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
相关产品推荐
相关产品推荐

