Python:当行元素由行名称中的字符串组成时删除行

时间:2017-07-07 01:24:31

标签: python dataframe delete-row

我有数据框:

        Col1   Col2    
Rowab1   3     5
Rowbc2   4     6
Rowxy3   7     2

我想搜索数据框,只保留行名称包含“bc”的行,同时删除其余的行:

        Col1   Col2
Rowab1   3     5
Rowxy3   7     2

我有以下代码:

df.loc[df.index.isin(['bc'])]

但是,这不会在字符串中搜索“bc”,但会搜索整个独立字符串“bc”。是否有任何“喜欢”的运营商可以合并,例如

df.loc[df.index.isin(['%bc%'])]  ?

谢谢!

2 个答案:

答案 0 :(得分:2)

您在帖子中说您希望删除不包含“bc”的每一行。以下是各种解决方案:

使用简单的字符串成员资格测试:

>>> df.ix[[i for i in df.index if 'bc' in i]]
        Col1  Col2
Rowbc2     4     6

使用正则表达式和re模块:

>>> df.ix[[i for i in df.index if re.match('.+bc.+', i)]]
        Col1  Col2
Rowbc2     4     6

您也可以使用pandas.Series.str.match,正如我在评论中提到的那样:

>>> df[pd.Series(data=df.index, index=df.index).str.match('.+bc.+')]
        Col1  Col2
Rowbc2     4     6

您无法在pandas.core.indexes.base.Index对象上直接使用pandas.Series.str.match,因此我只是将其转换为pandas.Series对象,并将有效垃圾作为值。您可以使用str个对象附带的Series访问者。

答案 1 :(得分:2)

pd.Series.str.find的另一种选择:

In [41]: df
Out[41]: 
        Col1  Col2
Rowab1     3     5
Rowbc2     4     6
Rowxy3     7     2

In [42]: df[df.index.str.find('bc') > -1]
Out[42]: 
        Col1  Col2
Rowbc2     4     6