熊猫整数过滤

时间:2018-08-21 23:11:27

标签: python pandas filtering

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

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

执行此操作的正确方法是什么?

5 个答案:

答案 0 :(得分:3)

您可以使用str.isnumeric()进行过滤

walmartIDS = data.loc[data.WalmartIDS.str.isnumeric()]
walmartIDS

    WalmartIDS  ASINS
602 20511489    B077BS6737
603 10311487    B077BMHVG7
604 10311302    B077BRTYCS
605 152381151   B077YW9PTQ
607 51409868    B0756DMVSC
608 51410962    B0756FKLCV
609 51411020    B0756F3F6J
610 51411529    B0756FDM74
611 915505165   B076W25SDZ
612 400796633   B076VM75ZF

答案 1 :(得分:2)

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

答案 2 :(得分:1)

DT[, paste0(.SD, '_ratio') := paste0(.SD, '_num') / paste0(.SD, '_denom'), .SDcols = c('a', 'b', 'c')]

str.isdigit

df[df['IDS'].str.isdigit()] Walmart IDS ASINS 0 602 20511489 B077BS6737 1 603 10311487 B077BMHVG7 2 604 10311302 B077BRTYCS 3 605 152381151 B077YW9PTQ 5 607 51409868 B0756DMVSC 6 608 51410962 B0756FKLCV 7 609 51411020 B0756F3F6J 8 610 51411529 B0756FDM74 9 611 915505165 B076W25SDZ 10 612 400796633 B076VM75ZF + pd.to_numeric

Series.notnull

答案 3 :(得分:1)

以便保留原始数据:

>>> df.join(df.loc[df['IDS'].str.isdigit(), 'IDS'], rsuffix='_clean')
    Walmart IDS ASINS   IDS_clean
0   602 20511489    B077BS6737  20511489
1   603 10311487    B077BMHVG7  10311487
2   604 10311302    B077BRTYCS  10311302
3   605 152381151   B077YW9PTQ  152381151
4   606 The-Holiday-Aisle-Projection-Kaleidoscope-Spid...   B076CNN6K5  NaN
5   607 51409868    B0756DMVSC  51409868
6   608 51410962    B0756FKLCV  51410962
7   609 51411020    B0756F3F6J  51411020
8   610 51411529    B0756FDM74  51411529
9   611 915505165   B076W25SDZ  915505165
10  612 400796633   B076VM75ZF  400796633

由有效数字代码组成的列名为IDS_clean。任何文本代码(例如第4行)都将保留NaN值。

答案 4 :(得分:0)

您需要使用正则表达式(re):

import re
walmartIDS[re.match(r'^[-+]?[0-9]+$', walmartIDS.WalmartIDS) is not None]