2017-04-19 1 views
2

私は列の1つにユーザー情報が含まれるpandasデータフレームを持っています。この列の各レコードは、ユーザー情報の辞書を含むリストです。 follwoingのように:パンダ:列内の複数のオブジェクト値に基づいて行を選択します。

           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  

私はSTATUSがACTVで、NAMEはABCである行だけを選択したいです。データが入れ子になっている行を選択するにはどうすればいいですか?したがって、上記の中で唯一の行dfを3

答えて

3

を選択されますあなたは可能性がありapplyUSER列をループして、辞書のいずれかがサブセットのブールシリーズを作るの条件を満たすかどうかを確認:

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

我々はpd.Panelにあなたのdf.USER列を解凍し、トンを見つけることができます彼はそのように行。オーバーヘッドがたくさんあります。それだけの価値はありません!しかし、クール...おそらく。私は後でやり直します。

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 
関連する問題