У меня есть данные df
выглядит так
Label1 Label2
a {l1,l2}
b {l1}
c {}
d {l3}
e {l3,l2}
Я хочу иметь возможность выбирать строки, столбец Label2 которых содержит l2
, т. е. строки с label1 =a and e
. Я знаю о методе isin
, например, df['Label2'].isin(..)
, но это не тот вопрос о членстве (скорее наоборот). Я хочу что-то похожее на df['Label2'].contains('l2')
.
действительно ли значения в Label2
установлены? или это шнур?
Кроме того, не могли бы вы опубликовать желаемый результат, чтобы вам было легче помочь
@coldspeed, в моем примере это строка, но не обязательно.
Предполагая, что «l2» — это строка, а «Label2» состоит из наборов, простым решением будет просто преобразовать столбец набора в строку и выполнить str.contains
:
label = "l2"
df[df['Label2'].astype(str).str.contains(r'\b{}\b'.format(label))]
Label1 Label2
0 a {l1, l2}
4 e {l2, l3}
Другим вариантом является понимание списка:
df[['l2' in x if isinstance(x, set) else False for x in df['Label2']]]
Label1 Label2
0 a {l1, l2}
4 e {l2, l3}
Если у вас есть серия sets
, просто используйте оператор перекресток&
df.loc[df['Label2'] & {'l2'}]
Спасибо, использование пересечения достигает этого (и также выглядит как эффективный способ)
чем использование df.loc[]
отличается от простого использования df[..]
1
@VuNguyen Для этой цели совсем не отличается;}
Использование isin
с any
после преобразования sets
columns
в df
df[pd.DataFrame(df.Label2.tolist()).isin(['l2']).any(1)]
"l2" это строка?