在数据框中过滤多列的最佳方法是什么?
例如,我从数据中得到了这个样本:
Index Tag_Number
666052 A1-1100-XY-001
666382 B1-001-XX-X-XX
666385 **FROM** C1-0001-XXX-100
666620 D1-001-XX-X-HP some text
“ Tag_Number”列包含标签,但是我需要删除标签之前或之后的文本。共同的分度是“空间”。我的想法是将列分为多个并过滤以“ A1-,B1-,C1-,D1-”中的任何一个开头的这些列,即,如果单元格不以条件开头,则为False,否则为True然后应用到表格中,以便True值保持不变,但如果为False,则得到空值。最后,清除标签后,将它们合并为一列。我知道这可能很复杂,并且我很乐意接受任何建议。
我已经尝试过的:
Splitted = df.Tag_Number.str.split(" ",expand=True)
Splitted.columns = Splitted.columns.astype(str)
Splitted = Splitted.rename(columns=lambda s: "Tag"+s)
col_names = list(Splitted.columns)
Splitted
我将此Tag_number列分为30个列,但现在我正努力过滤掉每个列。 我创建了一个条件,可通过以下条件过滤每列:
asset = ('A1-','B1-','C1-','D1-')
但这仍然无济于事,我只为最后一列提供了一个数组,而不是我想的所有数组。
for col in col_names:
Splitted_filter = Splitted[col].str.startswith(asset, na = False)
Splitted_filter
是否可以通过此“资产”过滤器过滤每一列?
非常感谢
答案 0 :(得分:0)
如果您要清除与资产前缀不匹配的文本,那么我认为这会起作用。
sample = pd.read_csv(StringIO("""Index,Tag_Number
666052,A1-1100-XY-001
666382,B1-001-XX-X-XX
666385,**FROM** C1-0001-XXX-100
666620,D1-001-XX-X-HP some text"""))
asset = ('A1-','B1-','C1-','D1-')
def asset_filter(tag_n):
tags = tag_n.split() # common delimeter is "space"
tags = [t for t in tags if len([a for a in asset if t.startswith(a)]) >= 1]
return tags # can " ".join(tags) if str type is desired
sample['Filtered_Tag_Number'] = sample.Tag_Number.astype(str).apply(asset_filter)
看到可以定义一个自定义函数asset_filter
并将其应用于要转换的列。
结果是这样
Index Tag_Number Filtered_Tag_Number
0 666052 A1-1100-XY-001 [A1-1100-XY-001]
1 666382 B1-001-XX-X-XX [B1-001-XX-X-XX]
2 666385 **FROM** C1-0001-XXX-100 [C1-0001-XXX-100]
3 666620 D1-001-XX-X-HP some text [D1-001-XX-X-HP]