将JSON文件装入pandas Dataframe时出错

时间:2017-01-06 17:49:02

标签: python json pandas utf

我正在尝试将JSON文件放入数据框中。我目前的错误代码通过以下方法创建JSON文件:

fname = 'python.json'
with open(fname, 'r') as f, open('sentiment.json', 'w') as s:
for line in f:
    tweet = json.loads(line)
    # Create a list with all the terms
    tweet_words = tweet['text']
    output = subprocess.check_output(['curl', '-d', "text=" + tweet_words.encode('utf-8'), 'http://text-processing.com/api/sentiment/'])
    s.write(output+"\n")

它写入' sentiment.json' text-processing.com API请求的输出。然后我使用:

加载JSON
def load_json(file, skip):
with open(file, 'r') as f:
    read = f.readlines()
    json_data = (json.loads(line) for i, line in enumerate(read) if i%skip==0)
return json_data

然后使用以下方法构建数据框:

sentiment_df = load_json('sentiments.json', 1)

data = {'positive': [], 'negative': [], 'neutral': []}
for s in sentiment_df:
      data['positive'].append(s['probability']['pos'])
      data['negative'].append(s['probability']['neg'])
      data['neutral'].append(s['probability']['neutral'])

df = pd.DataFrame(data)

错误: ValueError:无法解码JSON对象

我浏览了几个相关的问题,并根据WoodrowShigeru的答案here,我怀疑它可能与我的编码有关 - ' utf-8'在第一个代码块中。

有没有人知道一个好的解决方案?或者至少提供一些指示?谢谢你们!

修改1

Screen of 'sentiment.json'

1 个答案:

答案 0 :(得分:0)

您的屏幕截图不是有效的json,因为容器必须包含所有以逗号分隔的订单项。但是,挑战在于您的命令行调用返回一个字符串output,然后您将其写入文本文件。您需要创建一个字典列表,然后使用json.dumps()将其转储到json文件。

在第一个文本文件读取期间,通过将命令行字符串转换为带有ast.literal_eval()的字典来考虑这样做。然后将每个字典附加到列表中:

import ast

fname = 'python.json'
dictList = []
with open(fname, 'r') as f, open('sentiment.json', 'w') as s:
  for line in f:
      tweet = json.loads(line)
      # Create a list with all the terms
      tweet_words = tweet['text']
      output = subprocess.check_output(['curl', '-d', "text=" + tweet_words.encode('utf-8'), 
                                        'http://text-processing.com/api/sentiment/'])
      # CONVERT STRING TO DICT AND APPEND TO LIST
      dictList.append(ast.literal_eval(output))

  # CONVERT TO JSON AND WRITE TO FILE
  s.write(json.dumps(dictList, indent=4))

从那里,将json文件读入带有json_normalize的pandas数据帧。下面使用示例数据:

Sentiment json file

import json
import pandas as pd

with open('sentiment.json') as f:
    data = json.load(f)

df = pd.io.json.json_normalize(data)
df.columns = [c.replace('probability.', '') for c in df.columns]
print(df)

#       label       neg   neutral       pos
# 0       pos  0.003228  0.204509  0.571945
# 1       pos  0.053094  0.097317  0.912760
# 2       pos  0.954958  0.163341  0.917178
# 3       pos  0.784391  0.646188  0.955281
# 4       pos  0.203419  0.050908  0.490738
# 5       neg  0.122760  0.705633  0.219701
# 6       neg  0.961012  0.923886  0.335999
# 7       neg  0.368639  0.562720  0.124530
# 8       neg  0.566386  0.802366  0.825956
# 9       neg  0.115536  0.512605  0.784626
# 10  neutral  0.202092  0.741778  0.567957
# 11  neutral  0.837179  0.051033  0.509777
# 12  neutral  0.333542  0.085449  0.610222
# 13  neutral  0.798188  0.248258  0.218591
# 14  neutral  0.873109  0.469737  0.005178
# 15      pos  0.916112  0.313960  0.750118
# 16      neg  0.810080  0.852236  0.212373
# 17  neutral  0.748280  0.039534  0.323145
# 18      pos  0.274492  0.461644  0.984955
# 19      neg  0.063772  0.793171  0.631172