我想做的是:
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(),但对如何执行此操作不了解。
答案 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 列表来迭代槽。问题中没有提到这一点,因此我将她的回答标记为正确。