亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據 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條經驗 獲得超6個贊

這是一個可能有效的“臟”解決方案(取決于框架中的實際內容):


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 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號