2 回答
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')]
您可以将它与任意数量的可迭代对象一起使用。
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。然后,您可以将该系列作为新列添加到原始框架中,然后仅筛选未找到该系列的行细绳。
添加回答
举报