基于ezdxf提取AutoCAD数据:DataFrame分离整数与字符串列问题
问题:分离DataFrame中的整数与字符串列
从AutoCAD用ezdxf提取数据存入pandas DataFrame后,两列数据类型均为object。已知每行必有一列是整数、另一列是字符串,需要将整数和字符串分别提取到对应新列(对应关系不能打乱)。尝试用.isdigit()生成布尔值,再通过lambda函数复制值到新列,但未成功,原代码及输出如下:
sdf3 = pd.DataFrame(columns=['1', '2']) # Loop to populate Data frame # then after it is populated attempt to group data print(sdf3.to_string()) sdf3.loc[:, 'first'] = sdf3.loc[:, '1'].astype(str).str.strip().str.isdigit() sdf3.loc[:, 'second'] = sdf3.loc[:, '2'].astype(str).str.strip().str.isdigit() sdf3['S_QTY'] = sdf3.apply(lambda x: x['1'] if x['first'].astype(str).str.contains('True') else x['2'], axis=1) print(sdf3.to_string())
原输出:
1 2 0 4 CL-1 1 CL-4 1 2 CL-2 15 3 CL-5 1 4 RBC-1 16 5 CL-8 4 1 2 first second 0 4 CL-1 True False 1 CL-4 1 False True 2 CL-2 15 False True 3 CL-5 1 False True 4 RBC-1 16 False True 5 CL-8 4 False True
解决方案
原代码的问题在于,x['first']本身就是布尔值,不需要转成字符串再判断contains('True'),直接用布尔值判断即可。修正后的代码如下:
# 生成布尔列(和原代码一致) sdf3.loc[:, 'first'] = sdf3.loc[:, '1'].astype(str).str.strip().str.isdigit() sdf3.loc[:, 'second'] = sdf3.loc[:, '2'].astype(str).str.strip().str.isdigit() # 修正lambda判断逻辑 sdf3['S_QTY'] = sdf3.apply(lambda x: x['1'] if x['first'] else x['2'], axis=1) # 同时提取字符串列 sdf3['PART_NO'] = sdf3.apply(lambda x: x['2'] if x['first'] else x['1'], axis=1) # 可选:将S_QTY转为整数类型 sdf3['S_QTY'] = sdf3['S_QTY'].astype(int) print(sdf3.to_string())
修正后输出:
1 2 first second S_QTY PART_NO 0 4 CL-1 True False 4 CL-1 1 CL-4 1 False True 1 CL-4 2 CL-2 15 False True 15 CL-2 3 CL-5 1 False True 1 CL-5 4 RBC-1 16 False True 16 RBC-1 5 CL-8 4 False True 4 CL-8
更高效的优化方案(无需中间布尔列)
如果不想生成first和second中间列,可以直接用一行代码完成提取,效率更高:
# 提取整数列(S_QTY)和字符串列(PART_NO) sdf3['S_QTY'] = sdf3.apply(lambda x: x['1'] if str(x['1']).strip().isdigit() else x['2'], axis=1).astype(int) sdf3['PART_NO'] = sdf3.apply(lambda x: x['2'] if str(x['1']).strip().isdigit() else x['1'], axis=1)
这样可以省去中间布尔列的生成,直接完成数据分离。
内容的提问来源于stack exchange,提问作者Rand0mdude
相关产品推荐
相关产品推荐

