我用我创建的函数制作了一个数据帧
data = generate_xml()
然后,我根据列名(在本例中称为WalmartIDS和asin)生成数据帧的子集下面是一个数据框架的示例
walmartIDS = data.loc[:,['WalmartIDS','ASINS']]
>>
WalmartIDS ASINS
602 20511489 B077BS6737
603 10311487 B077BMHVG7
604 10311302 B077BRTYCS
605 152381151 B077YW9PTQ
606 The-Holiday-Aisle-Projection-Kaleidoscope-Spider-Airblown-Inflatable- Halloween-Decoration-THDA5581.html B076CNN6K5
607 51409868 B0756DMVSC
608 51410962 B0756FKLCV
609 51411020 B0756F3F6J
610 51411529 B0756FDM74
611 915505165 B076W25SDZ
612 400796633 B076VM75ZF
如您所见,有时坏数据会进入walmartids列。所以我想通过删除新创建的walmartids数据框中的所有行来过滤掉这个问题,其中walmartids列包含整数以外的字符。我不想更改数据帧的数据版本,因为它是原始数据。
walmartIDS[walmartIDS.WalmartIDS != '^[-+]?[0-9]+$']
然而,上面的解决方案似乎什么也做不了,实际上我仍然可以看到坏数据(在示例中,这是第606行),它应该被删除。
正确的方法是什么?
最佳答案
复制,转换为数字,删除na:
测试数据:
data = StringIO("""
Walmart IDS ASINS
602 20511489 B077BS6737
603 10311487 B077BMHVG7
604 10311302 B077BRTYCS
605 152381151 B077YW9PTQ
606 The-Holiday-Aisle-Projection-Kaleidoscope-Spider-Airblown-Inflatable-Halloween-Decoration-THDA5581.html B076CNN6K5
607 51409868 B0756DMVSC
608 51410962 B0756FKLCV
609 51411020 B0756F3F6J
610 51411529 B0756FDM74
611 915505165 B076W25SDZ
612 400796633 B076VM75ZF
""")
创建df并复制:
df = pd.read_table(data, delim_whitespace=True)
df2 = df
将ID转换为数值并删除具有na的行:
df2['IDS'] = pd.to_numeric(df2['IDS'], errors="coerce")
df2.dropna(how="any", inplace=True)
print(df2)
Walmart IDS ASINS
0 602 20511489.0 B077BS6737
1 603 10311487.0 B077BMHVG7
2 604 10311302.0 B077BRTYCS
3 605 152381151.0 B077YW9PTQ
5 607 51409868.0 B0756DMVSC
6 608 51410962.0 B0756FKLCV
7 609 51411020.0 B0756F3F6J
8 610 51411529.0 B0756FDM74
9 611 915505165.0 B076W25SDZ
10 612 400796633.0 B076VM75ZF