在这种情况下,如何优化 json 到数据帧的预处理

How to optimize pre-processing json to dataframes for this case

提问人:Chi0814 提问时间:11/13/2023 最后编辑:CorralienChi0814 更新时间:11/13/2023 访问量:56

问:

在此处输入图像描述

为了如上所述将每个数据从 json 更改为 dataframe,我编写了如下代码:

import json
import pandas as pd
import time
with open('color.json', 'r') as f:
    json_color = json.load(f)

df=pd.DataFrame(json_color)
start = time.time()
new_df=pd.DataFrame()
index_list=[]
for i in range(0,len(df)):
    for j,(key,value) in enumerate(df['result'][i]['RGB'].items()):
        key=key.split(',')
        df2 = pd.DataFrame(data=[[key[0],key[1],key[2],value]])
        index_list.append(df['result'][i]['name'][:-4]+'_'+str(j))
        new_df=pd.concat([new_df,df2])
new_df.index=index_list
new_df.columns=[['R','G','B','percentile']]
print(new_df)
print(time.time()-start)

它确实有效,但我希望我能更有效地更改这些代码。 这里有什么建议吗?

Python JSON Pandas 数据帧

评论

0赞 Corralien 11/13/2023
什么?df['result']
0赞 Chi0814 11/13/2023
我读取了json文件并将其保存到DataFrame中,DataFrame有两列。第一列包含每个图像的名称('~.jpg'),第二列包含每种颜色的每个RGB比率+百分位数(例如,对于1个jpg,可以有3种颜色,这意味着每种颜色有3个RGB值)
0赞 Corralien 11/13/2023
我的意思是没有理由使用您的数据的列名,除非您的 json 不同。'result'

答:

1赞 Corralien 11/13/2023 #1

使用 python 数据结构解决问题,然后将结果转换为 DataFrame 可能更简单:

name = json_color['name'].rsplit('.', maxsplit=1)[0]
data = {}
for j, (vals, P) in enumerate(json_color['RGB'].items()):
    R, G, B = vals.split(',')
    data[f'{name}_{j}'] = [int(R), int(G), int(B), P]
df = pd.DataFrame.from_dict(data, columns=['R', 'G', 'B', 'percentile'], orient='index')

输出:

>>> df
                                R    G    B  percentile
vogue_S_21_fashion-east_56_0   23   23   23       81.73
vogue_S_21_fashion-east_56_1  104  108  109       17.11
vogue_S_21_fashion-east_56_2  223  228  233        1.01
vogue_S_21_fashion-east_56_3  142  134   82        0.15

>>> json_color
{'name': 'vogue_S_21_fashion-east_56.jpg',
 'RGB': {'23,23,23': 81.73,
  '104,108,109': 17.11,
  '223,228,233': 1.01,
  '142,134,82': 0.15}}

但是,如果您看起来像:json_color

>>> json_color
{'result': [{'name': 'vogue_S_21_fashion-east_56.jpg',
   'RGB': {'23,23,23': 81.73,
    '104,108,109': 17.11,
    '223,228,233': 1.01,
    '142,134,82': 0.15}}]}

您可以使用:

data = {}
for record in json_color['result']:
    name = record['name'].rsplit('.', maxsplit=1)[0]
    for j, (vals, P) in enumerate(record['RGB'].items()):
        R, G, B = vals.split(',')
        data[f'{name}_{j}'] = [int(R), int(G), int(B), P]

df = pd.DataFrame.from_dict(data, columns=['R', 'G', 'B', 'percentile'], orient='index')

评论

0赞 Chi0814 11/13/2023
谢谢你的建议,即使我留下了糟糕的解释。我会尝试一下,稍后再来这里。
0赞 Corralien 11/13/2023
@DuwonLim。我更新了我的答案,因为我认为您的 json 文件只有一个键(“result”),这是一个字典列表。你能检查一下吗?
0赞 Chi0814 11/13/2023
是的,json文件和您预期的一样。由于数据太多,我将 len(df) 更改为 10 以检查它是否正常工作。我的代码工作正常。您的建议看起来很合理,但它仅适用于原始 json 文件中的最后一个元素。
0赞 Corralien 11/13/2023
对不起,我犯了一个错误。你能试试我更新的代码吗?
0赞 Chi0814 11/13/2023
它有效而且速度更快。我会研究你的代码。感谢您的好意