Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据数据帧中内容的某些条件删除行_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何根据数据帧中内容的某些条件删除行

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

我想从数据帧中删除一些行(从.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/+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')]