Pandas:如果特定列不包含特定文本,则删除数据框中的行

Posted

技术标签:

【中文标题】Pandas:如果特定列不包含特定文本,则删除数据框中的行【英文标题】:Pandas: Delete Rows in a dataframe if specific columns don't contain specific text 【发布时间】:2021-11-11 15:52:40 【问题描述】:

我有一个 df

     id  column_int column_int  column_A column_B column_C column_D
 0   1        int       int         ABC     ABC     Keep      na
 1   2        int       int         ABC     ABC     ABC       ABC
 2   3        int       int         ABC     Save    na        na
 3   4        int       int         ABC     Keep    na        na
 4   5        int       imt         ABC     ABC     ABC       ABC
 .
 . 

其中column_int 是包含整数的列,column A-D 包含文本值。我只想保留具有KeepSave 作为行值的行

之前:

 id  column_int column_int  column_A column_B column_C column_D
 0   1        int       int         ABC     ABC     Keep      na
 1   2        int       int         ABC     ABC     ABC       ABC
 2   3        int       int         ABC     Save    na        na
 3   4        int       int         ABC     Keep    na        na
 4   5        int       imt         ABC     ABC     ABC       ABC

之后:

 id  column_int column_int  column_A column_B column_C column_D
 0   1        int       int         ABC     ABC     Keep      na
 2   3        int       int         ABC     Save    na        na
 3   4        int       int         ABC     Keep    na        na

我尝试了以下

for column in df:
    if type(column) == object:
        df = df[df[column].str.contains('Save')] | df[df[column].str.contains('Keep')]
    else:
        pass

【问题讨论】:

【参考方案1】:

您可以在选定的列上使用.apply(),然后通过str.contains 为每一列检查SaveKeep。然后,在axis=1(用于逐行操作)上使用.any() 来检查该行是否包含此类字符串。

最后按.loc过滤,如下:

cols = ['column_A',  'column_B',  'column_C',  'column_D']

df.loc[df[cols].apply(lambda x: x.str.contains(r'Save|Keep')).any(axis=1)]

结果:

   id column_int column_int.1 column_A column_B column_C column_D
0   1        int          int      ABC      ABC     Keep       na
2   3        int          int      ABC     Save       na       na
3   4        int          int      ABC     Keep       na       na

【讨论】:

成功了!谢谢【参考方案2】:

如果没有 for 循环,可能会更容易和更清晰。

dfA = df.loc[(df.column_A == 'Save') or (df.column_A == 'Keep')]
dfB = df.loc[(df.column_B == 'Save') or (df.column_B == 'Keep')]
dfC = df.loc[(df.column_C == 'Save') or (df.column_C == 'Keep')]
dfD = df.loc[(df.column_D == 'Save') or (df.column_D == 'Keep')]

然后将数据框连接在一起

df = pd.concat([dfA, dfB, dfC, dfD])

【讨论】:

以上是关于Pandas:如果特定列不包含特定文本,则删除数据框中的行的主要内容,如果未能解决你的问题,请参考以下文章

pandas基于dataframe字符串数据列不包含特定字符串来筛选dataframe中的数据行(rows where values do not contain substring)

如果系列的值包含pandas中的特定字符集,则替换后续字符

pandas如何删除指定行

如果组中的最后一个元素包含Pandas中的特定字符串,则标记

如果数据包含特定的文本,则隐藏元素? [复制]

text [使用特定字符串删除数据]删除包含特定字符串的数据行。 #pandas