В следующем примере, как сохранить только строки с "a"
в массиве, присутствующем в tags
столбцов?
df = pd.DataFrame(columns=["val", "tags"], data=[[5,["a","b","c"]]])
df[3<df.val] # this works
df["a" in df.tags] # is there an equivalent for filtering on tags?
Я считаю, что использование наборов является интуитивным. Затем вы можете использовать >=
качестве установленной оболочки
df[df.tags.apply(set) >= {'a'}]
val tags
0 5 [a, b, c]
Альтернативой Numpy будет
tags = df['tags']
n = len(tags)
out = np.zeros(n, np.bool8)
i = np.arange(n).repeat(tags.str.len())
np.logical_or.at(out, i, np.concatenate(tags) == 'a')
df[out]
Per @JonClements
Вы можете использовать set.issubset
на map
(очень умно)
df[df.tags.map({'a'}.issubset)]
val tags
0 5 [a, b, c]
Использовать список:
df1 = df[["a" in x for x in df.tags]]
вы можете использовать apply
с лямбда-функцией, которая проверяет, является ли 'a'
аргументом лямбда:
df.tags.apply(lambda x: 'a' in x)
Результат:
0 True
Name: tags, dtype: bool
Это также можно использовать для индексации вашего фрейма данных:
df[df.tags.apply(lambda x: 'a' in x)]
Результат:
val tags
0 5 [a, b, c]
df.tags.map({'a'}.issubset)
здесь