删除不包含特定字符串的行的百分比

Posted

技术标签:

【中文标题】删除不包含特定字符串的行的百分比【英文标题】:Drop % of rows that do not contain specific string 【发布时间】:2021-10-21 13:09:06 【问题描述】:

我想在标签列中删除 20% 的不包含“p”或“u”的行。 我知道如何删除所有这些,但我不知道如何删除某些百分比的行。 这是我的代码:

import pandas as pd

df = pd.DataFrame("text": ["a", "b", "c", "d", "e", "f", "g", "h"],
                   "label": ["o-o-o", "o-o", "o-u", "o", "o-o-p-o", "o-o-o-o-o-o", "p-o-o", "o-o"]
)

print(df)

df = df[(df["label"].str.contains('p')) | (df["label"].str.contains('u'))]
print(df)

【问题讨论】:

请记住,对于带有多个“或”的 str.contains,您可以编写:df["label"].str.contains('p|u', regex=True) 【参考方案1】:

用途:

#for unique indices
df = df.reset_index(drop=True)

#get mask for NOT contains p or u
m = ~df["label"].str.contains('p|u')

#get 20% Trues from m
#https://***.com/a/31794767/2901002
mask = np.random.choice([True, False], m.sum(), p=[0.2, 0.8])

#filter both masks and remove rows
df = df.drop(df.index[m][mask])

【讨论】:

【参考方案2】:

你可以这样更新你的代码:

import pandas as pd

df = pd.DataFrame("text": ["a", "b", "c", "d", "e", "f", "g", "h"],
                   "label": ["o-o-o", "o-o", "o-u", "o", "o-o-p-o", "o-o-o-o-o-o", "p-o-o", "o-o"]
)

print(df)
drop_list = df[(~df["label"].str.contains('p')) & (~df["label"].str.contains('u'))].index.tolist()
number_of_drop = int(len(drop_list)*0.2)
drop_list = drop_list[:number_of_drop]
df.drop(number_of_drop, inplace=True)
print(df)

【讨论】:

以上是关于删除不包含特定字符串的行的百分比的主要内容,如果未能解决你的问题,请参考以下文章

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

删除列包含特定子字符串的行[重复]

删除作为其他行子字符串的行

如何在 R 中删除包含特定字符串的行?

用于从 CSV 中删除带有特定单词的行的批处理文件

在python数据框中删除不包含列中特定字符串的多列的重复项