Python 如何根据数据帧中内容的某些条件删除行
我想从数据帧中删除一些行(从.txt文件读取)。 换句话说,我只想保留有趣的行。 我的数据框如下所示:Python 如何根据数据帧中内容的某些条件删除行,python,pandas,dataframe,Python,Pandas,Dataframe,我想从数据帧中删除一些行(从.txt文件读取)。 换句话说,我只想保留有趣的行。 我的数据框如下所示: data 0 ID-0123456789 #ID I need 1 AG-TH/RGS_Srbcd_675F9_TRL #randrom text I dont need 2 15.00 #value I need (belongs to ID above) 3 NDFSD/+vb
data
0 ID-0123456789 #ID I need
1 AG-TH/RGS_Srbcd_675F9_TRL #randrom text I dont need
2 15.00 #value I need (belongs to ID above)
3 NDFSD/+vbdgfnhj_46/THS #randrom text I dont need
4 Sgbfd_FG-fdg_GRT/DR.x #randrom text I dont need
5 ID-1234567890 #ID I need
6 3_F/H_ & S/J #randrom text I dont need
7 0.00 #value I need (belongs to ID above)
... ... ...
没有模式,有时有更多的“随机文本我不需要”行,有时没有。
我试着根据内容删除行,比如保留df[“data”].str.startswith(“ID”)
,它保留ID。。。行,但我丢失了值。
我尝试将其与type()
组合,但列中的值也是字符串。
我的下一个想法是关注数字,但“随机文本我不需要”行在某些情况下也包含数字。
在删除不必要的行后,我希望得到这样的df:
data
0 ID-0123456789 #ID I need
2 15.00 #value I need (belongs to ID above)
5 ID-1234567890 #ID I need
7 0.00 #value I need (belongs to ID above)
... ... ...
有什么想法吗?
如果ID和值位于不同的列中,这不是问题,事实上,我的目标是最终得到:
ID value
0 ID-0123456789 15.00
1 ID-1234567890 0.00
...
提前谢谢你!
很抱歉,如果这是显而易见的,我是python和编程新手。随机文本总是一样的吗?如果是这样,您可以尝试:
#converting to a series, finding the ones that match, and adding back to the table
find_text = df['data']
#create series that has 0 for what matches the ads
text_found = find_Ads.str.find("random text I don't need")
#add column to table with 0's
df['Random'] = text_found
#create new table with those rows with zero gone
df = df[df['Random'] != 1].reset_index(drop=True)
这将创建一个系列,查找包含随机文本的每一行,并为其指定1。然后,您可以将序列作为新列添加到原始帧中,然后仅筛选未找到该字符串的行。这里有一个“脏”解决方案,它可能会起作用(取决于帧中的实际内容):
或者(看起来有点礼貌):
输出:
ID value
0 ID-0123456789 15
1 ID-1234567890 0
如果有可能一些随机文本以ID-
开头,那么类似这样的内容会更安全:
import re
re_id = re.compile(r'^ID-\d{10}$')
def is_id(obj):
return bool(re_id.match(str(obj).strip()))
df = pd.DataFrame(zip(df[df['data'].apply(is_id)]['data'],
df[df['data'].apply(type) == float]['data']),
columns=['ID', 'value'])
一些评论:
数据帧/系列的方法在此“适用”
由于df['data']
是一个系列,因此函数是针对每一行的id
,即单个元素。结果是一系列bool
值,True
在找到ID的地方,False
否则:
0 True
1 False
2 False
3 False
4 False
5 True
6 False
7 False
如果您将此系列“插入”到原始帧df[…]
中,则会删除具有相应False
的每一行
内置函数将iterables“配对”为迭代器。为了说明它的作用:
list(zip([1, 2, 3, 4], ['a', 'b', 'c', 'd']))
导致
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
您可以将它与算术数的iterables一起使用。看起来您在使用
pandas
之前必须进行一些预处理。您的数据看起来如何?你说这是一个文本文件。这是什么意思?它是一个包含大量连续文本的文件吗?或者它是一个已经构建的数据帧,其中的行分布完全没有模式?您好,文本文件包含许多行:一个ID行、一些随机文本行、一些始终具有相同文本的行(例如:“粉红大象”)和一个值行。这种情况重复出现,问题是随机文本行的数量和内容正在改变。阅读完文件后,我已经去掉了类似“粉红大象”的行。这将有助于使您的示例数据更能代表问题,并根据输入显示预期输出,以便我们能够提供更准确的答案。hi,随机文本行包含各种文本。我已经使用一些类似的解决方案,如您的建议,删除了内容始终相同的行。(我添加了一个标志列,而不是使用一个新的系列,但方法大致相同。)您好,我使用我的文件尝试了最后一个代码,它工作得非常好,谢谢!我知道您正在使用常规表达式对包含ID的行进行排序,但我在理解zip和apply的组合时遇到了一些困难。你能帮我补充一下吗?提前谢谢你@用户14421092很好!我不能100%确定它是否能在样本数据之外工作。只要有一个不规则的地方就会破坏结果。我刚刚添加了一些评论。我希望他们能有所帮助。谢谢你的评论!这真的很有帮助。
0 True
1 False
2 False
3 False
4 False
5 True
6 False
7 False
list(zip([1, 2, 3, 4], ['a', 'b', 'c', 'd']))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]