JSON 格式化字符串到 pandas 数据框

JSON formatted string to pandas dataframe

好的,我整个下午都在用这个头撞墙。我知道有很多类似的帖子,但我不断出错,可能犯了一个愚蠢的错误。

我正在使用此处找到的 apyori 包进行一些交易篮子分析:https://pypi.python.org/pypi/apyori/1.1.1

似乎包 dump_as_json() 方法为每个可能的篮子吐出 RelationRecords 的字典。

我想将这些 json 格式的字典放入一个 pandas 数据帧中,但是在尝试使用 pd.read_json().

时遇到了不同的错误

这是我的代码:

import apyori, shutil, os
from apyori import apriori
from apyori import dump_as_json
import pandas as pd
import json

try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO

transactions = [
    ['Jersey','Magnet'],
    ['T-Shirt','Cap'],
    ['Magnet','T-Shirt'],
    ['Jersey', 'Pin'],
    ['T-Shirt','Cap']
]
results = list(apriori(transactions))
results_df = pd.DataFrame()
for RelationRecord in results:
    dump_as_json(RelationRecord,output_file)
print output_file.getvalue()
json_file = json.dumps(output_file.getvalue())
print json_file


print data_df.head()

关于如何将存储在 output_file 中的 json 格式的字典放入 pandas 数据帧中有什么想法吗?

我建议阅读 Whosebug 关于生成 Minimal, Complete, and Verifiable example 的指南。此外,像 "I keep getting errors" 这样的语句也不是很有帮助。也就是说,我查看了您的代码和这个 apyori 包的源代码。除了拼写错误,问题行似乎在这里:

for RelationRecord in results:
    dump_as_json(RelationRecord,output_file)

您正在创建一个每行一个对象的 JSON 文件(我认为这有时被称为 LSON 或 Line-JSON。)作为一个完整的文档,它只是无效 JSON。您可以尝试将其保留为同类词典列表或其他一些 pd.DataFrame 友好结构。

output = []
for RelationRecord in results:
    o = StringIO()
    dump_as_json(RelationRecord, o)
    output.append(json.loads(o.getvalue()))
data_df = pd.DataFrame(output)
您可以使用以下脚本将 Apriori 结果进一步转换为更好看的数据框:
summary_df = pd.DataFrame(columns=('Items','Antecedent','Consequent','Support','Confidence','Lift'))

Support =[]
Confidence = []
Lift = []
Items = []
Antecedent = []
Consequent=[]

for RelationRecord in results: 
    for ordered_stat in RelationRecord.ordered_statistics:
        Support.append(RelationRecord.support)
        Items.append(RelationRecord.items)
        Antecedent.append(ordered_stat.items_base)
        Consequent.append(ordered_stat.items_add)
        Confidence.append(ordered_stat.confidence)
        Lift.append(ordered_stat.lift)

summary_df['Items'] = Items                                   
summary_df['Antecedent'] = Antecedent
summary_df['Consequent'] = Consequent
summary_df['Support'] = Support
summary_df['Confidence'] = Confidence
summary_df['Lift']= Lift

最终数据框如下所示:

希望这对您有所帮助:)