我想删除数据帧中的某些行(从.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和编程的新手。
答案 0 :(得分:1)
这是一个可行的“肮脏”解决方案(取决于框架中的实际内容):
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']
是一个Series。结果是一系列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')]
您可以将其与无数可迭代对象一起使用。
答案 1 :(得分:0)
随机文本是否总是相同?如果是这样,您可以尝试:
#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。然后,您就可以将该序列作为新列添加到原始框架中,然后仅过滤出执行该操作的行找不到该字符串。