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
包含文本值。我只想保留具有Keep
或Save
作为行值的行
之前:
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
为每一列检查Save
或Keep
。然后,在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)