You can use loc
for selecting by condition created str.contains
with parameter case=False
. Last if you need list
use tolist
:
li = ['Sensor','0x024']
for i in li:
print (df.loc[df['title'].str.contains(i, case=False),'id'].tolist())
[3, 4]
[1, 4]
For storing you can use dict
comprehension:
dfs = { i: df.loc[df['title'].str.contains(i, case=False),'id'].tolist() for i in li }
print (dfs['Sensor'])
[3, 4]
print (dfs['0x024'])
[1, 4]
If you need function
, try get_id
:
def get_id(id):
ids = df.loc[df['title'].str.contains(id, case=False),'id'].tolist()
return "Input String = %s : Output = ID " % id +
" and ".join(str(x) for x in ids) +
" has '%s' in it." % id
print (get_id('Sensor'))
Input String = Sensor : Output = ID 3 and 4 has 'Sensor' in it.
print (get_id('0x024'))
Input String = 0x024 : Output = ID 1 and 4 has '0x024' in it.
EDIT by comment:
Now it is more complicated, because use logical and
:
def get_multiple_id(ids):
#split ids and crete list of boolean series containing each id
ids1 = [df['title'].str.contains(x, case=False) for x in ids.split()]
#http://stackoverflow.com/a/20528566/2901002
cond = np.logical_and.reduce(ids1)
ids = df.loc[cond,'id'].tolist()
return "Input String = '%s' : Output = ID " % id +
' and '.join(str(x) for x in ids) +
" has '%s' in it." % id
print (get_multiple_id('0x024 Sensor'))
Input String = '0x024 Sensor' : Output = ID 4 has '0x024 Sensor' in it.
If use logical or
, it is more easier, because or
in re
is |
, so you can use 0x024|Sensor
:
def get_multiple_id(id):
ids = df.loc[df['title'].str.contains(id.replace(' ','|'), case=False),'id'].tolist()
return "Input String = '%s' : Output = ID " % id +
' and '.join(str(x) for x in ids) +
" has '%s' in it." % id
print (get_multiple_id('0x024 Sensor'))
Input String = '0x024 Sensor' : Output = ID 1 and 3 and 4 has '0x024 Sensor' in it.