Панды: сравнить объекты списка в серии
В моем фрейме данных столбец состоит из списков, например:
df = pd.DataFrame({'A':[[1,2],[2,4],[3,1]]})
Мне нужно выяснить расположение списка [1,2] в этом кадре данных. Я пытался:
df.loc[df['A'] == [1,2]]
и
df.loc[df['A'] == [[1,2]]]
но потерпел неудачу полностью. Сравнение кажется очень простым, но это просто не работает. Я что-то здесь упускаю?
Ответы
Ответ 1
Не используйте list
в ячейке, это создает много проблем для pandas
. Если вам нужен столбец object
, используйте tuple
:
df.A.map(tuple).isin([(1,2)])
Out[293]:
0 True
1 False
2 False
Name: A, dtype: bool
#df[df.A.map(tuple).isin([(1,2)])]
Ответ 2
Вы можете использовать apply
и сравнивать как:
df['A'].apply(lambda x: x==[1,2])
0 True
1 False
2 False
Name: A, dtype: bool
print(df[df['A'].apply(lambda x: x==[1,2])])
A
0 [1, 2]
Ответ 3
С массивами Numpy
df.assign(B=(np.array(df.A.tolist()) == [1, 2]).all(1))
A B
0 [1, 2] True
1 [2, 4] False
2 [3, 1] False
Ответ 4
Используя NumPy
df.A.apply(lambda x: (np.array(x) == np.array([1,2])).all())
0 True
1 False
2 False
Ответ 5
Или:
df['A'].apply(([1,2]).__eq__)
Тогда:
df[df['A'].apply(([1,2]).__eq__)]