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

我想从数据框中删除一些行(从 .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 和编程的新手。


开满天机
浏览 74回答 2
2回答

ibeautiful

这是一个可能有效的“脏”解决方案(取决于框架中的实际内容):data = [    'ID-0123456789',    'AG-TH/RGS_Srbcd_675F9_TRL',    15.00,    'NDFSD/+vbdgfnhj_46/THS',    'Sgbfd_FG-fdg_GRT/DR.x',    'ID-1234567890',    '3_F/H_ & S/J',    0.00,]df = pd.DataFrame(data, columns=['data'])df = pd.concat(    [pd.DataFrame(df[df['data'].apply(lambda x: str(x)[:3]) == 'ID-'].values, columns=['ID']),     pd.DataFrame(df[df['data'].apply(type) == float].values, columns=['value'])],     axis=1)或者(看起来更文明一点):df = pd.DataFrame(zip(df[df['data'].apply(lambda x: str(x)[:3]) == 'ID-']['data'],                      df[df['data'].apply(type) == float]['data']),                  columns=['ID', 'value'])输出:              ID value0  ID-0123456789    151  ID-1234567890     0如果某些随机文本有可能以以下形式开头ID-,那么这样的事情会更安全:import rere_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'])一些评论:DataFrame/Series 的 apply 方法在这里“应用”df['data'].apply(is_id)每行(即单个元素)的函数is_id,因为df['data']是一个系列。结果是一系列bool值,True其中找到 ID,False否则:0     True1    False2    False3    False4    False5     True6    False7    False如果您将此系列“插入”到原始框架中,则每一行都会删除df[...]相应的行。False内置zip函数将可迭代对象“配对”成迭代器。为了说明它的作用:list(zip([1, 2, 3, 4], ['a', 'b', 'c', 'd']))导致[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]您可以将它与任意数量的可迭代对象一起使用。

富国沪深

随机文本总是相同吗?如果是这样,您可以尝试:#converting to a series, finding the ones that match, and adding back to the tablefind_text = df['data']#create series that has 0 for what matches the adstext_found = find_Ads.str.find("random text I don't need")#add column to table with 0'sdf['Random'] = text_found#create new table with those rows with zero gonedf = df[df['Random'] != 1].reset_index(drop=True)这将创建一个系列,找到包含随机文本的每一行,并为其分配 1。然后,您可以将该系列作为新列添加到原始框架中,然后仅筛选未找到该系列的行细绳。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python