2017-10-14 12 views
1

jsonドキュメントがあるとします: {"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"GlossDef":{"GlossSeeAlso":[" XML、XLS "]}}}}}}jsonドキュメントフィルタリングのためのパンダの使用

私はpandas.io.normalizeを使用して、それをデータフレーム構造にフラット化します。その後、データフレームにjsonクエリに一致する行があるかどうかを検索する場合は、ex: {"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"GlossDef":{"GlossSeeAlso" [」XLS」]}}}}}}

file1.json:

[{ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "ISO 8879:1986", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
}, 
{ 
    "glossary": { 
     "title": "example glossary", 
     "GlossDiv": { 
      "title": "S", 
      "GlossList": { 
       "GlossEntry": { 
        "ID": "SGML", 
        "SortAs": "SGML", 
        "GlossTerm": "Standard Generalized Markup Language", 
        "Acronym": "SGML", 
        "Abbrev": "ISO 8879:1986", 
        "GlossDef": { 
         "para": "A meta-markup language, used to create markup languages such as DocBook.", 
         "GlossSeeAlso": ["GML", "XML","DSG"] 
        }, 
        "GlossSee": "markup" 
       } 
      } 
     } 
    } 
}] 

file2.json:

{“glossary":{“GlossDiv":{“GlossList":{“GlossEntry":{“GlossDef":{“GlossSeeAlso”:[“DSG"]}}}}}} 

出力として1行を期待。

どうすれば同じことをやりますか? と仮定file1.jsonはfile2.jsonに存在する単一のJSONレコード

import pandas as pd 
from pandas.io.json import json_normalize 
file1=open('file1.json') 
file2=open('file2.json') 
records = json.load(file1) 
df = json_normalize(records) 

filter_record=json.load(file2) 
#Need to filter df such that all the rows satisfy column values in filter_record 
# Code : 
+0

は、あなたがより多くのデータを追加することができますをし、データフレームのコードですか?ネストされたキーは '.'で区切られたカラム名を作成しますか? – jezrael

+0

が追加されました。はいネストされたキーは、で区切られたカラム名に変換されます。 –

+0

ありがとうございます。しかし、より多くの行のサンプルデータがなくても、あなたのサンプルでは、​​1列のデータフレームが1行しか得られません。実際のデータには多くの列がありますか?それ以上の行?または両方? – jezrael

答えて

1

使用に基づいてフィルタリングする必要がある複数のレコードがあります。

df1 = json_normalize(a) 
#print(df1) 

df2 = json_normalize(b) 
#print(df2) 

#filter columns from df2 if contains df1 
df = df1[df2.columns.intersection(df1.columns)] 
#print (df) 

#create sets 
a = np.array([set(x) for x in df.iloc[:, 0].tolist()]) 
b = np.array([set(x) for x in df2.iloc[:, 0].tolist()]) 
print (a) 
[{'XML', 'GML'} {'XML', 'DSG', 'GML'}] 
print (b) 
[{'DSG'}] 

#testing match 
matches = (b[:, None] <= a) 
print (matches) 
[[False True]] 

#flatenning 
any_ = matches[0] 

#test if not NaNs 
nul_ = df.iloc[:, 0].notnull().values 
mask = any_ & nul_ 
print (mask) 
[False True] 
#boolean indexing 
df1 = df1[mask] 

print (df1) 

    glossary.GlossDiv.GlossList.GlossEntry.Abbrev \ 
1         ISO 8879:1986 

    glossary.GlossDiv.GlossList.GlossEntry.Acronym \ 
1           SGML 

    glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso \ 
1         [GML, XML, DSG]    

    glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para \ 
1 A meta-markup language, used to create markup ...  

    glossary.GlossDiv.GlossList.GlossEntry.GlossSee \ 
1           markup 

    glossary.GlossDiv.GlossList.GlossEntry.GlossTerm \ 
1    Standard Generalized Markup Language 

    glossary.GlossDiv.GlossList.GlossEntry.ID \ 
1          SGML 

    glossary.GlossDiv.GlossList.GlossEntry.SortAs glossary.GlossDiv.title \ 
1           SGML      S 

    glossary.title 
1 example glossary 
関連する問題