根据Pandas中的字符串列表过滤掉行

时间:2015-03-07 10:50:12

标签: python pandas filter

我有一个大型时间序列数据框(称为 df ),前5个记录如下所示:

df

         stn     years_of_data  total_minutes avg_daily TOA_daily   K_daily
date                        
1900-01-14  AlberniElementary      4    5745    34.100  114.600 0.298
1900-01-14  AlberniWeather         6    7129    29.500  114.600 0.257
1900-01-14  Arbutus                8    11174   30.500  114.600 0.266
1900-01-14  Arrowview              7    10080   27.600  114.600 0.241
1900-01-14  Bayside                7    9745    33.800  114.600 0.295

目标:

  

我正在尝试删除列表中 任何 字符串的行   存在于 'stn' 列中。所以,我基本上试图过滤这个数据集,不包括下面列表中包含任何字符串的行。

尝试:

remove_list = ['Arbutus','Bayside']

cleaned = df[df['stn'].str.contains('remove_list')]

返回:

缺货[78]:

stn years_of_data   total_minutes   avg_daily   TOA_daily   K_daily
date    

没有<!/强>

我尝试了一些引号,括号甚至是lambda函数的组合;虽然我很新,所以可能没有正确使用语法..

3 个答案:

答案 0 :(得分:14)

使用isin

cleaned = df[~df['stn'].isin(remove_list)]

In [7]:

remove_list = ['Arbutus','Bayside']
df[~df['stn'].isin(remove_list)]
Out[7]:
                          stn  years_of_data  total_minutes  avg_daily  \
date                                                                     
1900-01-14  AlberniElementary              4           5745       34.1   
1900-01-14     AlberniWeather              6           7129       29.5   
1900-01-14          Arrowview              7          10080       27.6   

            TOA_daily  K_daily  
date                            
1900-01-14      114.6    0.298  
1900-01-14      114.6    0.257  
1900-01-14      114.6    0.241  

答案 1 :(得分:2)

我只想将我的 2 美分添加到这个非常重要的用例中(过滤出按字符串值索引的项目列表)。 .isin() 方法的参数,不必是列表!它可以是 pd.Series!然后你可以做这样的事情:

df[~df['stn'].isin(another_df['stn_to_remove_column_there'])]

明白我的意思吗?您可以在没有 .to_list() 方法的情况下使用此构造。

答案 2 :(得分:0)

有一个类似的问题,找到了这个旧线程,我认为还有其他方法可以得到相同的结果。对于我的特定应用程序,@ EdChum解决方案的问题是我没有一个列表会完全匹配。如果您遇到相同的问题,则.isin不适用于该应用程序。

相反,您还可以尝试一些选项,包括numpy.where:

  removelist = ['ayside','rrowview']
  df['flagCol'] = numpy.where(df.stn.str.contains('|'.join(remove_list)),1,0)

请注意,此解决方案实际上并不删除匹配的行,只是对其进行标记。您可以根据需要复制/切片/拖放。

例如,在您不知道站名是否为大写且不希望预先通过标准化文本的情况下,此解决方案将非常有用。 numpy.where通常也非常快,可能与.isin并没有太大区别。