我用我创建的函数制作了一个数据帧

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

10-06 11:18