【问题标题】:Transform single Json columns' all rows into multiple columns将单个 Json 列\'所有行转换为多列
【发布时间】:2022-10-23 20:20:14
【问题描述】:

df 具有以下列:

指数(

['level_id', 'description', 'level_type', '难度', '解决方案', '修饰符','last_modified','time_limit','tags','level_options', '额外信息','提示']

, dtype='对象')

我正在转换的列是 =“level_options”

下面是 level_options 第一行中的数据:

{“标记”:“正常”,“选项”:{“1”:“二氧化碳”,“2”: “氧气”,“3”:“尿液”,“4”:“汗水”},“max_score”:1, “随机选项”:“假”,“正确选项”:[“2”]}

然后在下面的代码中:我手动传递了上面的第一行,得到了预期的输出。

>     j2=[{"marking": "normal", "options": {"1": "Yes", "2": "No"}, "max_score": 1, "random_options": "false", "correct_options": ["1"]}]
>     pd.json_normalize(j2)

输出:

marking   max_score     random_options   correct_options      options.1   options.2     options.3   options.4  
normal      1             false            [2]       Carbon dioxide Oxygen         Urine        Sweat

但是在遍历所有行时,我没有得到输出。
我在下面的代码中使用了这个我应该得到 6 个列表但得到空列表的地方。预期输出的 PFA-final output

Option1=[] 
Option2=[] 
Option3=[] 
Option4=[] 
Option5=[]
Correct_option=[]
 try:
>     for index, row in df.iterrows():
>         l=row["level_options"]
>         print(l) except:
>     print(index,row)
>     l = json.loads(l) 
>     print(l)
>     for i in l:
>         i = pd.normalize_json(i) 
>         print(i)
>         if i['options'] == '1':
>             Option1.append(i['value'])
>         elif i['options'] == '2':
>             Option2.append(i['value'])
>         elif i['options'] == '3':
>             Option3.append(i['value'])
>         elif i['options'] == '4':
>             Option4.append(i['value'])
>         elif i['options'] == '5':
>             Option5.append(i['value'])
>         elif i['options'] == 'correct_options':
>             Correct_option.append(i['value'])

我什至使用 json.loads 而不是 json_normalize 但发生错误

下面是 2 行 dataframe= df["level_options"]

{“标记”:“正常”,“选项”:{“1”:“二氧化碳”,“2”: “氧气”,“3”:“尿液”,“4”:“汗水”},“max_score”:1, “随机选项”:“假”,“正确选项”:[“2”]} {“标记”: “正常”,“选项”:{“1”:“是”,“2”:“否”},“max_score”:1, “随机选项”:“假”,“正确选项”:[“1”]}

下面显示的输出是我在将每个列表合并为单个数据框后所期望的,我遇到的问题是在检索列表时......

谢谢并恭祝安康

options.1   options.2     options.3 options.4  options.5    correct_options    
Carbon dioxide  Oxygen      Urine      Sweat       NaN               [2]    
Yes              No           NaN        NaN        NaN               [1]  

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    只需在专栏上尝试pd.json_normalize

    out = (pd.json_normalize(df['level_options'])
           .filter(like='option')
           .drop('random_options', axis=1))
    
    print(out)
    
      correct_options       options.1 options.2 options.3 options.4
    0             [2]  Carbon dioxide    Oxygen     Urine     Sweat
    1             [1]             Yes        No       NaN       NaN
    

    【讨论】:

      【解决方案2】:

      谢谢,但是当我使用您的代码时出现此错误。您在df["level_options"] 中放置了哪些数据?

      KeyError                                  Traceback (most recent call last)
      Input In [107], in <cell line: 1>()
      ----> 1 out = (pd.json_normalize(df["level_options"])
            2        .filter(like='option')
            3        .drop('random_options', axis=1))
      KeyError: "['random_options'] not found in axis"
      

      我也使用了相同的规范化乐趣,但只获得了我手动传递的那些行的输出,因为我已经这样做了,但我想直接从数据框......没有得到所有行的输出。

         z=[{"marking": "normal", "options": {"1": "Carbon dioxide", "2": "Oxygen", "3": "Urine", "4": "Sweat"}, "max_score": 1, "random_options": "false", "correct_options": ["2"]} ,{"marking": "normal", "options": {"1": "Yes", "2": "No"}, "max_score": 1, "random_options": "false", "correct_options": ["1"]}] 
      a=pd.json_normalize(z).filter(like='option').drop('random_options', axis=1)
      
      
          print(a)
          correct_options  options.1 options.2 options.3 options.4 
      0       [2]    Carbon dioxide  Oxygen   Urine   Sweat 
      1       [1]         Yes          No     NaN       NaN
      

      【讨论】:

      • 我仍然无法获得一列所有行的输出
      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      • 这似乎是答案帖子中讨论的延续。标记为 NAA。
      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多