Python Pandas按条件列表过滤数据框列

时间:2020-08-27 23:31:43

标签: python pandas dataframe

在数据框中过滤多列的最佳方法是什么?

例如,我从数据中得到了这个样本:

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

是否可以通过此“资产”过滤器过滤每一列?

非常感谢

1 个答案:

答案 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]