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

Posted

技术标签:

【中文标题】根据 Pandas 中的字符串列表过滤行【英文标题】:Filter out rows based on list of strings in Pandas 【发布时间】:2015-05-08 23:03:26 【问题描述】:

我有一个大型时间序列数据框(称为 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 函数的组合;虽然我很新,所以可能没有正确使用语法..

【问题讨论】:

【参考方案1】:

使用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  

【讨论】:

还有其他方法吗?使用lambda x: ... 设置一些功能怎么样?我尝试的方法怎么样。我什至接近或能够做我想做的事?教我钓鱼,不要只给我一条鲷鱼! :)【参考方案2】:

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

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

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

请注意,此解决方案实际上并没有删除匹配的行,只是标记它们。您可以随意复制/切片/删除。

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

【讨论】:

谢谢 - 因为这具有处理子字符串的额外优势。【参考方案3】:

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

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

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

【讨论】:

以上是关于根据 Pandas 中的字符串列表过滤行的主要内容,如果未能解决你的问题,请参考以下文章

根据 Pandas 中的条件过滤行

如何根据 Pandas 中的列表过滤 DataFrame 中的项目?

Pandas 过滤多个串联子串

Pandas - 检查列表列中的字符串列是不是按行排列

Python Pandas:有没有办法根据列表中的字符串获取子集数据帧

获取 Pandas DataFrame 列中字符串列表中的所有行 - 此模式具有匹配组