Reputation: 441
I have a column with a list of IDs in each row. I need to be able to search for ID(s) and output the row that contains the ID. I have included sample data below.
I need to be able to input a single ID, or multiple IDs in the search. I have tried the code below but I get the error included at the end of this question.
buyers[buyers['customer_list'].str.contains('48184' )]
buyers[buyers['customer_list'].str.contains('48184', '55684')]
Data
df = pd.DataFrame({'A':[[48184, 48184, 64970, 64970], [55684, 72990, 72990, 85673], [55684, 72990, 72990, 85673], [64247, 60131, 60131, 60131], [64544, 64544, 64544, 64544]]})
Error
KeyError Traceback (most recent call last)
<ipython-input-42-3229146c6a64> in <module>()
----> 1 buyers[buyers['customer_list2'].str.contains( '48184' )]
/opt/conda/lib/python3.6/site-packages/pandas/core/frame.py in __getitem__(self, key)
2680 if isinstance(key, (Series, np.ndarray, Index, list)):
2681 # either boolean or fancy integer index
-> 2682 return self._getitem_array(key)
2683 elif isinstance(key, DataFrame):
2684 return self._getitem_frame(key)
/opt/conda/lib/python3.6/site-packages/pandas/core/frame.py in _getitem_array(self, key)
2724 return self._take(indexer, axis=0)
2725 else:
-> 2726 indexer = self.loc._convert_to_indexer(key, axis=1)
2727 return self._take(indexer, axis=1)
2728
/opt/conda/lib/python3.6/site-packages/pandas/core/indexing.py in _convert_to_indexer(self, obj, axis, is_setter)
1325 if mask.any():
1326 raise KeyError('{mask} not in index'
-> 1327 .format(mask=objarr[mask]))
1328
1329 return com._values_from_object(indexer)
KeyError: '[nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan\n nan nan nan nan nan nan] not in index'
Upvotes: 0
Views: 68
Reputation: 323226
Using dataframe constructor and isin
+ any
pd.DataFrame(df.A.tolist()).isin([48184,55684]).any(1)
Out[29]:
0 True
1 True
2 True
3 False
4 False
dtype: bool
Upvotes: 2
Reputation: 14093
You can use apply with a lambda function:
searchValue = input('ID Search: ')
mask = df['A'].apply(lambda x: int(searchValue) in x)
print(df[mask])
ID Search: 72990
A
1 [55684, 72990, 72990, 85673]
2 [55684, 72990, 72990, 85673]
if you want to search multiple values from input:
searchValue = input('ID Search: ') # input numbers
nums = [int(n) for n in searchValue.split(',')] # list comprehension to int n for n in the input values separated by comma
mask = df['A'].apply(lambda x: any(elem in x for elem in nums)) # create a mask for any elem in nums and in x which is each row
print(df[mask])
ID Search: 72990,48184
A
0 [48184, 48184, 64970, 64970]
1 [55684, 72990, 72990, 85673]
2 [55684, 72990, 72990, 85673]
Upvotes: 0