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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:06:34