2016-07-16 5 views
0

私はcsvfilesを使っています。私の目標は、csvfile情報を持つjson形式を書くことです。コードIで、しかしpandasシリーズとDataFrameを使ってjsonフォーマットを書いてください

[ 
{ 
    "source": "Germany", 
    "target": "Mexico", 
    "value": 1 
}, 
{ 
    "source": "Germany", 
    "target": "USA", 
    "value": 2 
}, 
{ 
    "source": "Brazil", 
    "target": "Argentina", 
    "value": 3 
} 
] 

:私はフォーマットは次のようになります持っている情報によると

{"source": "Napoleon", "target": "Myriel", "value": 1}, 

:Especifically、私はmiserables.json

例と同様の形式を取得したいです出力は次のように使用されます:

[ 
{ 
    "source": "Germany", 
    "target": "Mexico", 
    "value": 1 
}, 
{ 
    "source": null, 
    "target": "USA", 
    "value": 2 
} 
][ 
{ 
    "source": "Brazil", 
    "target": "Argentina", 
    "value": 3 
} 
] 

Nullソース必須ドイツ。この問題を抱える都市が増えているため、これは主要な問題の1つです。この他に、情報は正しいです。私はちょうどフォーマットの中のいくつかのリストを削除し、正しい国にヌルを置き換えたいです。

これはpandascollectionsを使用して使用したコードです。

csvdata = pandas.read_csv('file.csv', low_memory=False, encoding='latin-1') 
countries = csvdata['country'].tolist() 
newcountries = list(set(countries)) 
for element in newcountries: 
    bills = csvdata['target'][csvdata['country'] == element] 
    frquency = Counter(bills) 
    sourceTemp = [] 
    value = [] 
    country = element 
    for k,v in frquency.items(): 
     sourceTemp.append(k) 
     value.append(int(v)) 
    forceData = {'source': Series(country), 'target': Series(sourceTemp), 'value': Series(value)} 
    dfForce = DataFrame(forceData) 
    jsondata = dfForce.to_json(orient='records', force_ascii=False, default_handler=callable) 
    parsed = json.loads(jsondata) 
    newData = json.dumps(parsed, indent=4, ensure_ascii=False, sort_keys=True) 
    # since to_json doesn´t have append mode this will be written in txt file 
    savetxt = open('data.txt', 'a') 
    savetxt.write(newData) 
    savetxt.close() 

この問題を解決するためのあらゆる提案があります。

おかげ

+3

入力CSVファイルの一部の行を入力できますか? –

答えて

1

はスカラー値、全国のSeries()を削除することを検討してください。これを行い、一連の辞書をデータフレームにアップサイズすると、NaN(後でjsonのnullに変換されます)を他のシリーズの長さに合わせてシリーズに挿入します。あなたはdfForceのデータフレームをプリントアウトすることで、これを見ることができます:

from pandas import Series 
from pandas import DataFrame 

country = 'Germany'  
sourceTemp = ['Mexico', 'USA', 'Argentina'] 
value = [1, 2, 3] 

forceData = {'source': Series(country), 
      'target': Series(sourceTemp), 
      'value': Series(value)} 
dfForce = DataFrame(forceData) 

#  source  target value 
# 0 Germany  Mexico  1 
# 1  NaN  USA  2 
# 2  NaN Argentina  3 

解決するには、単にシリーズの辞書にスカラーとして国を守る:

forceData = {'source': country, 
      'target': Series(sourceTemp), 
      'value': Series(value)} 
dfForce = DataFrame(forceData) 

#  source  target value 
# 0 Germany  Mexico  1 
# 1 Germany  USA  2 
# 2 Germany Argentina  3 

ところで、あなたは必要ありません。 jsonに出力するデータフレームオブジェクト。辞書のリストを使用するだけです。キーの順序を維持するために、Ordered Dictionary collectionを使用して以下を考慮してください。このようにして、増加するリストはテキストファイルにダンプされ、追加することなく無効なjsonを隣接する角カッコの対角にするようにします...][...は許可されません。

from collections import OrderedDict 
... 

data = [] 

for element in newcountries: 
    bills = csvdata['target'][csvdata['country'] == element] 
    frquency = Counter(bills) 

    for k,v in frquency.items(): 
     inner = OrderedDict() 
     inner['source'] = element 
     inner['target'] = k 
     inner['value'] = int(v) 

     data.append(inner) 

newData = json.dumps(data, indent=4) 

with open('data.json', 'w') as savetxt: 
    savetxt.write(newData) 
+0

ありがとうございます、@パルフェットもっと良くなりました。 – estebanpdl

関連する問題