在pandas中过滤一个列,只包含一组已定义的字符

时间:2017-05-21 14:58:46

标签: python pandas dataframe

使用panda处理csv文件。 我的任务是过滤名为manual_raw_value的列上的文件,如下所示 我想只保留满足以下条件的行:

a = ['0','1','2','3','4','5','6','7','8','9',':','/','.',',','%','$','€']

仅保留manual_raw_value中单元格值仅为the list a中描述的字符组合的行。

我该怎么做? 我尝试了以下内容,其中删除了单元格中有字母的行。

 # coding: utf-8

import os
import pandas as pd 
df = pd.read_csv('file.csv',sep=',')
b = ['a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

joined_2 = "|".join(b)
mask_2 =  ~df['manual_raw_value'].str.contains(joined_2)
cols = ['manual_raw_value']
df = df[mask_2].reset_index(drop=True)
df.to_csv('file_2.csv',index=False,sep=',')

这样做的有效方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以将此正则表达式 r'^[\d:/.,%$€]+$'str.match一起使用,\d0-9的缩写; 这里将要匹配的字符放在字符类[\d:/.,%$€]中,然后匹配列表中的任何字符,然后使用锚点^$来表示字符的开始和结束字符串^[\d:/.,%$€]+$然后匹配一个字符串,该字符串包含一个或多个(此处 + 表示的)字符感兴趣:

实施例

df = pd.DataFrame({"manual_raw_value": ["1232", "sdk", ".32", "$299", "*23", "€21", "/21"]})

df
# manual_raw_value
#0  1232
#1  sdk
#2  .32
#3  $299
#4  *23
#5  €21
#6  /21

a = r'^[\d:/.,%$€]+$'

a
# '^[\\d:/\\.,%\\$\xe2\x82\xac]+$'

df[df.manual_raw_value.str.match(a)]

#manual_raw_value
#0  1232
#2  .32
#3  $299
#5  €21
#6  /21

或者从列表a构建模式:

pattern = '^[{}]+$'.format(''.join(a))

df[df.manual_raw_value.str.match(pattern)]
#manual_raw_value
#0  1232
#2  .32
#3  $299
#5  €21
#6  /21

答案 1 :(得分:0)

您可以使用isalpha进行过滤:

<item name="android:windowDisablePreview">true</item>

<强>计时

df = df[~df['manual_raw_value'].str.isalpha()]
#borrowing data from another answer
print (df)
  manual_raw_value
0             1232
2              .32
3             $299
4              *23
5              €21
6              /21