将 JSON 文件装入 pandas 数据框时出错
Error fitting a JSON file into a pandas Dataframe
我正在尝试将 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' 文本请求的输出-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)
错误: 值错误:无法解码 JSON 对象
我浏览了几个相关问题,根据WoodrowShigeru的回答here,我怀疑这可能与我在第一段代码中编码成'utf-8'有关。
有谁知道好的解决办法吗?或者至少提供一些方向?谢谢大家!
编辑 1
Screen of 'sentiment.json'
您的屏幕截图无效 json,因为容器必须包含所有以逗号分隔的行项目。然而,挑战在于您的命令行调用 returns 一个字符串 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_normalize 将 json 文件读入 pandas 数据帧。下面使用示例数据:
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
我正在尝试将 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' 文本请求的输出-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)
错误: 值错误:无法解码 JSON 对象
我浏览了几个相关问题,根据WoodrowShigeru的回答here,我怀疑这可能与我在第一段代码中编码成'utf-8'有关。
有谁知道好的解决办法吗?或者至少提供一些方向?谢谢大家!
编辑 1
Screen of 'sentiment.json'
您的屏幕截图无效 json,因为容器必须包含所有以逗号分隔的行项目。然而,挑战在于您的命令行调用 returns 一个字符串 output
,然后您将其写入文本文件。您需要创建一个字典列表,然后使用 json.dumps()
.
考虑在第一次读取文本文件时将命令行字符串转换为带有 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_normalize 将 json 文件读入 pandas 数据帧。下面使用示例数据:
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