2 回答

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')]
您可以將它與任意數量的可迭代對象一起使用。

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。然后,您可以將該系列作為新列添加到原始框架中,然后僅篩選未找到該系列的行細繩。
添加回答
舉報