2016-07-16 2 views
0

Я работаю с csvfiles. Моя цель - написать json-формат с информацией csvfile. Especifically, я хочу, чтобы получить подобный формат, как miserables.jsonНапишите формат json, используя pandas Series и DataFrame

Пример:

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

Согласно с имеющейся у меня информации формат будет:

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

Однако, с кодом I используемый результат выглядит следующим образом:

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

Null источник должен быть в Германии. Это одна из основных проблем, потому что в этой области больше городов. Кроме того, информация верна. Я просто хочу удалить несколько списков внутри формата и заменить нуль на правильную страну.

Это код, который я использовал, используя pandas и collections.

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 (позже преобразованный в null в json) в серию, чтобы соответствовать длинам других серий. Вы можете увидеть это, распечатав dfForce dataframe:

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 

Кстати, вам не нужен объект dataframe для вывода в 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

Спасибо, @Parfait Гораздо лучше. – estebanpdl

Смежные вопросы