2017-04-19 173 views
2

我有一个熊猫数据框,其中一列包含用户信息。该列的每个记录都是一个列表,其中又包含用户信息的字典。像下面这样:熊猫:根据列中的多个对象值选择行

           USER      id 
1 [{u'STATUS': u'INACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}] 634618 
2 [{u'STATUS': u'INACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}] 642054 
3 [{u'STATUS': u'ACTV', u'NAME': 'abc'},{u'STATUS': u'ACTV', u'NAME': 'xyz'}] 631426  

我想只选择状态为ACTV且NAME为abc的行。如何选择数据嵌套的行。因此,在上述DF只有3个,将选择

回答

3

行你可以循环通过与apply,然后USER列检查是否有字典的满足这使得子集的布尔一系列条件:

df[df.USER.apply(lambda lst: any(d['NAME']=='abc' and d['STATUS']=='ACTV' for d in lst))] 

#            USER  id 
#3 [{'STATUS': 'ACTV', 'NAME': 'abc'}, {'STATUS':... 631426 
1

您可以通过字符串比较筛选数据框:

df[(df['USER'].str.contains('\'STATUS\': u\'ACTV\'')) & (df['USER'].str.contains('\'NAME\': u\'abc\''))] 
3

我们可以解开你的df.USER列到pd.Panel并找到ŧ他那样行。大量的开销。不值得!但很酷......也许。我稍后再试。

pn = pd.Panel({k: pd.DataFrame(v) for k, v in df.USER.iteritems()}) 
cond1 = pn.loc[:, :, 'STATUS'] == 'ACTV' 
cond2 = pn.loc[:, :, 'NAME'] == 'abc' 

df.loc[pn.loc[(cond1 & cond2).any(), :, :].items] 

               USER  id 
2 [{'STATUS': 'ACTV', 'NAME': 'abc'}, {'STATUS':... 631426