Python 将数据帧转换为JSON

Python 将数据帧转换为JSON,python,json,pandas,dataframe,to-json,Python,Json,Pandas,Dataframe,To Json,我将数据存储在pandas dataframe中,我想将tat转换为JSON格式。可以使用以下代码复制示例数据 data = {'Product':['A', 'B', 'A'], 'Zone':['E/A', 'A/N', 'E/A'], 'start':['08:00:00', '09:00:00', '12:00:00'], 'end':['12:30:00', '17:00:00', '17:40:00'], 'seq':[

我将数据存储在pandas dataframe中,我想将tat转换为JSON格式。可以使用以下代码复制示例数据

data = {'Product':['A', 'B', 'A'],
        'Zone':['E/A', 'A/N', 'E/A'],
        'start':['08:00:00', '09:00:00', '12:00:00'],
        'end':['12:30:00', '17:00:00', '17:40:00'],
        'seq':['0, 1, 2 ,3 ,4','0, 1, 2 ,3 ,4', '0, 1, 2 ,3 ,4'],
        'store':['Z',"'AS', 'S'", 'Z']
        }

df = pd.DataFrame(data)
df_parsed = json.loads(df.to_json(orient="records"))
我尝试使用以下代码将其转换为JSON格式

data = {'Product':['A', 'B', 'A'],
        'Zone':['E/A', 'A/N', 'E/A'],
        'start':['08:00:00', '09:00:00', '12:00:00'],
        'end':['12:30:00', '17:00:00', '17:40:00'],
        'seq':['0, 1, 2 ,3 ,4','0, 1, 2 ,3 ,4', '0, 1, 2 ,3 ,4'],
        'store':['Z',"'AS', 'S'", 'Z']
        }

df = pd.DataFrame(data)
df_parsed = json.loads(df.to_json(orient="records"))
从上面生成的输出

[{'Product': 'A', 'Zone': 'E/A', 'start': '08:00:00', 'end': '17:40:00', 'seq': '0, 1, 2 ,3 ,4', 'store': 'Z'}, {'Product': 'B', 'Zone': 'A/N', 'start': '09:00:00', 'end': '17:00:00', 'seq': '0, 1, 2 ,3 ,4', 'store': 'AS'}, {'Product': 'A', 'Zone': 'E/A', 'start': '08:00:00', 'end': '17:40:00', 'seq': '0, 1, 2 ,3 ,4', 'store': 'Z'}]
预期结果:

{
'A': {'Zone': 'E/A', 
'tp': [{'start': [8, 0], 'end': [12, 0], 'seq': [0, 1, 2 ,3 ,4]},
      {'start': [12, 30], 'end': [17, 40], 'seq': [0, 1, 2 ,3 ,4]}],
      
'store': ['Z']
}, 
'B': {'Zone': 'A/N', 
'tp': [{'start': [9, 0], 'end': [17, 0], 'seq': [0, 1, 2 ,3 ,4]}],
      
'store': ['AS', 'S']
}
}

如果一个产品属于同一个存储区,
start
end
seq
列的结果应如所需输出所示。此外,如果时间值为“09:00:00”则开始时间和结束时间应表示为
[9,0]
如果时间值为
“09:00:00”
则只需表示小时和分钟,这样我们就可以从
时间
列中丢弃秒值。

这将有点复杂。所以你必须一步一步地做:

def funct(row):
    row['start'] = row['start'].str.split(':').str[0:2]
    row['end'] = row['end'].str.split(':').str[0:2]
    row['store'] = row['store'].str.replace("'", "").str.split(', ')

    d = (row.groupby('Zone')[row.columns[1:]]
        .apply(lambda x: x.to_dict(orient='record'))
        .reset_index(name='tp').to_dict(orient='row'))
    return d

di = df.groupby(['Product'])[df.columns[1:]].apply(funct).to_dict()

di:

{'A': [{'Zone': 'E/A',
   'tp': [{'start': ['08', '00'],
     'end': ['12', '30'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['Z']},
    {'start': ['12', '00'],
     'end': ['17', '40'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['Z']}]}],
 'B': [{'Zone': 'A/N',
   'tp': [{'start': ['09', '00'],
     'end': ['17', '00'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['AS', 'S']}]}]}
{'A': {'Zone': 'E/A',
  'tp': [{'start': [8, 0], 'end': [12, 30], 'seq': [0, 1, 2, 3, 4]},
   {'start': [12, 0], 'end': [17, 40], 'seq': [0, 1, 2, 3, 4]}],
  'store': ['Z']},
 'B': {'Zone': 'A/N',
  'tp': [{'start': [9, 0], 'end': [17, 0], 'seq': [0, 1, 2, 3, 4]}],
  'store': ['AS', ' S']}}
 
说明:
  • 首先,创建自己的自定义函数
  • 开始
    结束
    列更改为列表形式
  • 区域分组
    ,并将其应用于其他列
  • 重置索引并命名具有以下内容的列:
    [{'start':['08','00'],'end':['12','30'],'seq':'0,1,2,3,4',
    作为
    tp
  • 现在应用于整个结果并返回它
最终,您需要将您的数据帧转换为以下格式,一旦您能够这样做,其余的事情将变得简单

Zone    tp
E/A    [{'start': ['08', '00'], 'end': ['12', '30'], ...
A/N    [{'start': ['09', '00'], 'end': ['17', '00'], ... 
编辑:
di:

{'A': [{'Zone': 'E/A',
   'tp': [{'start': ['08', '00'],
     'end': ['12', '30'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['Z']},
    {'start': ['12', '00'],
     'end': ['17', '40'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['Z']}]}],
 'B': [{'Zone': 'A/N',
   'tp': [{'start': ['09', '00'],
     'end': ['17', '00'],
     'seq': '0, 1, 2 ,3 ,4',
     'store': ['AS', 'S']}]}]}
{'A': {'Zone': 'E/A',
  'tp': [{'start': [8, 0], 'end': [12, 30], 'seq': [0, 1, 2, 3, 4]},
   {'start': [12, 0], 'end': [17, 40], 'seq': [0, 1, 2, 3, 4]}],
  'store': ['Z']},
 'B': {'Zone': 'A/N',
  'tp': [{'start': [9, 0], 'end': [17, 0], 'seq': [0, 1, 2, 3, 4]}],
  'store': ['AS', ' S']}}
 

在转换为JSON格式之前,您需要转换数据帧。例如,您可以尝试使用
df.groupby('Product')聚合数据
或另一种pandas方法。@Sura da如果答案使用数据框进行了一些人工操作,那么它就可以了。如果我的答案有帮助,那么应该使用
groupby
,然后单击勾号将其标记为可接受的答案。您的答案几乎是正确的,除了一些属于预期结果的部分但无法实现的事情通过您的解决方案。如
start
end
seq
如果不是字符串形式,您可以参考我的问题以查看所需的实际输出。start/end应表示为
[8,0]
序列也应表示为
[1,2,3,4,5]
。您已经用
tp
使用
store
,您可以看到我想要的结果它不是
tp
的一部分,您可以提供修复方案吗?