首页 > 解决方案 > Pandas 整数过滤

问题描述

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

data = generate_xml()

然后,我根据列名制作数据框的子集,在本例中称为 WalmartIDS 和 ASINS。下面也是数据框的示例

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 行),它应该被删除。

这样做的正确方法是什么?

标签: pythonpandasfiltering

解决方案


制作副本,转换为数字,删除 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

将 IDS 转换为数字并用 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

推荐阅读