2017-04-19 156 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