我已经使用创建的函数制作了一个数据框
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行),应该删除该数据。
执行此操作的正确方法是什么?
答案 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)
测试数据:
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]