【问题标题】:Pandas: JSONDecodeError: Expecting value: line 1 column 1 (char 0)熊猫:JSONDecodeError:预期值:第 1 行第 1 列(字符 0)
【发布时间】:2021-12-26 05:58:26
【问题描述】:

输入是,

 df = pd.DataFrame([[1,'NaN','abj','1/1/2021'],
               [2,'[{"Result":"00018"},{"Result":"00065"}]','abj','1/1/2021'],
               [3,'','abj','1/1/2021']],
                 columns = ['ID','SKU','NOTES','Date'])

预期结果

        ID     SKU   NOTES
     0  1             abj
     1  2    00018    abj
     2  2    00065    abj
     3  3             abj 

尝试了以下方法,但报错

df.SKU = df.SKU.apply(lambda x : [ i['Result']  for i in  json.loads(x)])

df.explode('SKU')

结果错误:JSONDecodeError: Expecting value: line 1 column 1 (char 0)

【问题讨论】:

  • 显然 anfd x 不是 JSON 字符串。你试过打印吗?或者将您的理解扩展为一个 for 循环,以便您可以打印每个值。或者使用命名函数而不是 lambda,这样你就可以调试它
  • 当没有 'NaN 或 '' 时,同样的代码可以工作
  • 是的,NaN 不会解码为 JSON。所以删除它们,替换为'[]'?听起来您知道问题出在哪里。
  • 在lambda 中你应该使用一些if/else 并在你有NaN 或"" 时跳过json

标签: python json pandas


【解决方案1】:

您应该检查x 中的内容并跳过json

更长的版本但更易读

def convert(text):
    if text not in ('', 'NaN'):
        data = [i['Result'] for i in json.loads(text)]
    else:
        data = ''
    return data

df.SKU = df.SKU.apply(convert)

短版:

df.SKU = df.SKU.apply(lambda x : [i['Result'] for i in json.loads(x)] if x not in ('', 'NaN') else "")

编辑:

更通用的版本 - 它使用 try/except 所以它应该可以处理其他错误的字符串

def convert(text):
    try:   
        data = [i['Result'] for i in json.loads(text)]
    except Exception as ex:
        print(f'exeption: "{text}" : {ex}')
        data = ''
    return data

df.SKU = df.SKU.apply(convert)

完整的工作示例:

import pandas as pd
import json

df = pd.DataFrame([
        [1,'NaN','abj','1/1/2021'],
        [2,'[{"Result":"00018"},{"Result":"00065"}]','abj','1/1/2021'],
        [3,'','abj','1/1/2021']
     ], columns=['ID','SKU','NOTES','Date'])

print(df)

def convert(text):
    try:   
        data = [i['Result'] for i in json.loads(text)]
    except Exception as ex:
        print(f'exeption: "{text}" : {ex}')
        data = ''
    return data

df.SKU = df.SKU.apply(convert)
#df.SKU = df.SKU.apply(lambda x : [i['Result'] for i in json.loads(x)] if x not in ('', 'NaN') else "")

df = df.explode('SKU')

print(df)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 2019-02-25
    相关资源
    最近更新 更多