为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

开满天机 2023-10-26 10:17:35
我想从数据框中删除一些行(从 .txt 文件读取)。换句话说,我只想保留感兴趣的行。我的数据框如下所示:      data0     ID-0123456789              #ID I need1     AG-TH/RGS_Srbcd_675F9_TRL  #randrom text I dont need2     15.00                      #value I need (belongs to ID above)3     NDFSD/+vbdgfnhj_46/THS     #randrom text I dont need4     Sgbfd_FG-fdg_GRT/DR.x      #randrom text I dont need5     ID-1234567890              #ID I need6     3_F/H_ & S/J               #randrom text I dont need7     0.00                       #value I need (belongs to ID above)...   ...                        ...没有模式,有时有更多“我不需要的随机文本”行,有时则没有。我尝试根据内容删除行,例如保留df["data"].str.startswith("ID")ID...行,但我丢失了值。我尝试将其与 结合使用type(),但列中的值也是字符串。我的下一个想法是关注数字,但“我不需要的随机文本”行在某些情况下也包含数字。我想在删除不必要的行后得到这样的 df :      data0     ID-0123456789              #ID I need2     15.00                      #value I need (belongs to ID above)5     ID-1234567890              #ID I need7     0.00                       #value I need (belongs to ID above)...   ...                        ...任何想法?如果 ID 和值位于不同的列中,这不是问题,事实上我的目标是最终得到:     ID                 value0    ID-0123456789      15.001    ID-1234567890      0.00...先感谢您!抱歉,如果这是显而易见的,我是 python 和编程的新手。
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

这是一个可能有效的“脏”解决方案(取决于框架中的实际内容):


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 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'])

一些评论:


DataFrame/Series 的 apply 方法在这里“应用”


df['data'].apply(is_id)

每行(即单个元素)的函数is_id,因为df['data']是一个系列。结果是一系列bool值,True其中找到 ID,False否则:


0     True

1    False

2    False

3    False

4    False

5     True

6    False

7    False

如果您将此系列“插入”到原始框架中,则每一行都会删除df[...]相应的行。False


内置zip函数将可迭代对象“配对”成迭代器。为了说明它的作用:


list(zip([1, 2, 3, 4], ['a', 'b', 'c', 'd']))

导致


[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]

您可以将它与任意数量的可迭代对象一起使用。


查看完整回答
反对 回复 2023-10-26
?
富国沪深

TA贡献1790条经验 获得超9个赞

随机文本总是相同吗?如果是这样,您可以尝试:


#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。然后,您可以将该系列作为新列添加到原始框架中,然后仅筛选未找到该系列的行细绳。


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信