根据用户输入条件删除行(Pandas,Python 3)

时间:2014-09-30 00:12:03

标签: python python-3.x pandas

说我有这样的DF

  Words1            Score     
 The Man                 10        
 Right Hand              7         
 Bad Boy Company         7  
 Seven Deadly Sins       11       

我希望做的是创建一个这样的用户输入:

var = input("Enter the Words That Can Never Appear Together in the same phrase: ")

用户输入不应在短语中一起出现的单词。因此,假设var = Bad Company'DF变为df.dropna()

之后
  Words1           Score     
 The Man             10        
 Right Hand           7   
 Seven Deadly Sins   11      

所以我有两个问题:有没有办法真正做到这一点?如果是这样,如果有办法支持多个查询,例如,如果某人想要删除一行,其中包含“Bad”和“Company”出现在短语中的实例,并且还删除了“Seven”和“Sins”出现的任何行用一句话?

希望有人可以帮助我!

1 个答案:

答案 0 :(得分:3)

你可以向量化' Words1'进入一个系列,然后应用正则表达式:

>>> df
   Score              Words
0     10            The Man
1      7         Right Hand
2      7    Bad Boy Company
3     11  Seven Deadly Sins
>>> df['Words'].str.contains('Bad')
0    False
1    False
2     True
3    False
Name: Words, dtype: bool
>>> df['Words'].str.contains('^(?=.*Bad)(?=.*Company)')
0    False
1    False
2     True
3    False
Name: Words, dtype: bool

然后使用这些布尔值来删除布尔屏蔽所不需要的布尔值:

>>> df=df[df['Words'].str.contains('^(?=.*Bad)(?=.*Company)')==False]
>>> df
   Score              Words
0     10            The Man
1      7         Right Hand
3     11  Seven Deadly Sins

[3 rows x 2 columns]
>>> df=df[df['Words'].str.contains('^(?=.*Sins)(?=.*Seven)')==False]
>>> df
   Score       Words
0     10     The Man
1      7  Right Hand

[2 rows x 2 columns]

将用户输入拆分为模式:

>>> s=raw_input('Words: ')
Words: Seven Sins
>>> s
'Seven Sins'
>>> pattern='^'+''.join('(?=.*{})'.format(word) for word in s.split())
>>> pattern
'^(?=.*Seven)(?=.*Sins)'