通过特定列的可能前缀列表过滤数据框

时间:2018-08-29 19:05:51

标签: python python-3.x pandas

我想做的是:

options = ['abc', 'def']
df[any(df['a'].str.startswith(start) for start in options)]

我想应用一个过滤器,所以我只有在列“ a”中具有以给定选项之一开头的值的条目。

下一个代码可以工作,但是我需要它与多个前缀选项一起工作...

start = 'abc'
df[df['a'].str.startswith(start)]

错误消息是

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

阅读Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(),但对如何执行此操作不了解。

3 个答案:

答案 0 :(得分:3)

您可以将元组选项传递给

df = pd.DataFrame({'a': ['abcd', 'def5', 'xabc', '5abc1', '9def', 'defabcb']})
options = ['abc', 'def']
df[df.a.str.startswith(tuple(options))]

你得到

    a
0   abcd
1   def5
5   defabcb

答案 1 :(得分:2)

您可以尝试以下方法:

mask = np.array([df['a'].str.startswith(start) for start in options]).any(axis=1)

它为每个Series选项创建一个start,并沿相应的行应用any

您收到错误消息是因为内置函数需要一个bool的列表,但是由于错误消息提示“多值对象的真值是模棱两可的”,因此您需要使用一个数组-注意any

答案 2 :(得分:0)

另一个解决方案:

# extract all possible values for 'a' column
all_a_values = df['a'].unique()
# filter 'a' column values by my criteria
accepted_a_values = [x for x in all_a_values if any([str(x).startswith(prefix) for prefix in options])]
# apply filter
df = df[df['a'].isin(accepted_a_values))]

从此处获取:remove rows and ValueError Arrays were different lengths

@Vaishali提供的解决方案是最简单和合乎逻辑的,但是我还需要 accepted_a_values 列表来迭代槽。问题中没有提到这一点,因此我将她的回答标记为正确。