【问题标题】:Python pandas to_json() invalid formatPython pandas to_json() 格式无效
【发布时间】:2014-11-06 18:26:42
【问题描述】:

我在输出 JSON 字符串时遇到问题。我正在使用制表符分隔的 CSV 文件,它看起来像这样:

date        time        loc_id  country name    sub1_id sub2_id type
2014-09-11  00:00:01    179     US      acmnj   269     382     ico 
2014-09-11  00:00:01    179     US      acmnj   269     382     ico 
2014-09-11  00:00:01    179     GB      acmnj   269     382     ico 
2014-09-11  00:00:01    179     US      acmnj   269     382     ico 
2014-09-11  00:00:02    179     GB      acmnj   269     383     ico 
2014-09-11  00:00:02    179     JP      acmnj   269     383     ico 

代码如下:

df = pd.read_csv('log.csv',sep='\t',encoding='utf-16')
count = df.groupby(['country','name','sub1_id','sub2_id','type']).size()
print(count.order(na_position='last',ascending=False).to_frame().to_json(orient='index'))

输出如下所示(前几行):

{"["US","acmnj",269,383,"ico"]":{"0":76174},"["US","acmnj",269,382,"ico"]":{"0":73609},"["IT","acmnj",269,383,"ico"]":{"0":54211},"["IT","acmnj",269,382,"ico"]":{"0":52398},"["GB","acmnj",269,383,"ico"]":{"0":41346},"["GB","acmnj",269,382,"ico"]":{"0":40140},"["US","acmnj",269,405,"ico"]":{"0":39482},"["US","acmnj",269,400,"ico"]":{"0":39303},"["US","popcdd",178,365,"ico"]":{"0":33168},"["IT","acmnj",269,400,"ico"]":{"0":33026},"["IT","acmnj",269,405,"ico"]":{"0":32824},"["IT","achrfb141",141,42,"ico"]":{"0":26986},"["GB","acmnj",269,405,"ico"]":{"0":25895},"["IN","acmnj",269,383,"ico"]":{"0":25647},"["GB","acmnj",269,400,"ico"]":{"0":25488...

我想在 PHP 中加载这个输出,但是当我试图解码时我得到 NULL。我使用 JSON Validator 来检查字符串,它是无效的。我也尝试不使用 orient 参数,但我得到无效的 JSON 格式。

【问题讨论】:

    标签: python json python-3.x pandas


    【解决方案1】:

    这似乎是 Pandas 的问题。我重现了你的错误。

    DataFrame.to_json 可以采用几个不同的 orient 参数:'split'、'records'、'index'、'columns' 和 'values'。

    在你的情况下,'split'、'records' 和 'values' 似乎有效,但 'index' 和 'columns' 无效。

    您可以使用 json 模块在 python 中快速测试:

    df = pd.read_csv('log.csv',sep='\t',encoding='utf-16')
    count = df.groupby(['country','name','sub1_id','sub2_id','type']).size()
    f=count.order(ascending=False).to_frame()
    json.loads(f.to_json(orient='index'))  # This failed for me
    json.loads(f.to_json(orient='records')) #This worked
    

    【讨论】:

    • 我已经试过了。但后来我得到这样的输出......[{"0": 157965}, {"0": 154559}, {"0": 75518}, {"0": 74515}, {"0": 73697}, {"0": 71854}, {"0": 56883}...我没有“键值” - 我用来对计数进行分组的列。我需要使用 PHP 在 MySQL 中插入这些值。
    • 需要经过PHP吗?您可以使用 DataFrame.to_sql() 将数据框直接发送到 MySql - 这适用于您的情况吗?
    • 是的。我需要制作用于报告的 PHP API 脚本。
    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多