Shiang Hoo
Shiang Hoo

Reputation: 385

Pandas: compare list objects in Series

In my dataframe a column is made up of lists, for example:

df = pd.DataFrame({'A':[[1,2],[2,4],[3,1]]})

I need to find out the location of list [1,2] in this dataframe. I tried:

df.loc[df['A'] == [1,2]]

and

df.loc[df['A'] == [[1,2]]]

but failed totally. The comparison seems very simple but that just doesn't work. Am I missing something here?

Upvotes: 19

Views: 19858

Answers (5)

BENY
BENY

Reputation: 323226

Do not use list in cell, it creates a lot of problem for pandas. If you do need an object column, using 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)])]

Upvotes: 20

Vaishali
Vaishali

Reputation: 38415

Using numpy

df.A.apply(lambda x: (np.array(x) == np.array([1,2])).all())

0     True
1    False
2    False

Upvotes: 6

U13-Forward
U13-Forward

Reputation: 71570

Or:

df['A'].apply(([1,2]).__eq__)

Then:

df[df['A'].apply(([1,2]).__eq__)]

Upvotes: 0

piRSquared
piRSquared

Reputation: 294228

With Numpy arrays

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

Upvotes: 9

Space Impact
Space Impact

Reputation: 13255

You can use apply and compare as:

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]

Upvotes: 15

Related Questions