【问题标题】:how to get all the multi valued attributes into a csv file如何将所有多值属性放入 csv 文件
【发布时间】:2019-10-16 00:33:52
【问题描述】:

我有一个示例数据如下。以下属性属于 [data] 字典。在 "XXXX" 我有值 "Naveen" 在 "YYYYY" 我有 "Kumar" 和 "Rajesh" 。我正在尝试使用下面的代码来获得 2 个记录的输出

有什么建议请帮忙

    {
  "data": [
  {
      "Empid": "1234",
      "Empname": "ABC",
       "data1": {
          "XXXX": [
            {
              "relative": {
                "id": "Naveen"
              }
            }
          ],
          "YYYYY": [
            {
              "relative": {
                "id": "Kumar"
              }
            },
            {
              "relative": {
                "id": "Rajesh"
              }
            }
          ]
          }

     }
     ]
}

请找到下面的代码(我正在尝试)

df = pd.DataFrame()
for i in range(len(json_file['data'])):
    temp = {}
    temp['Empid'] = json_file['data'][i]['Empid']
    temp['EmpName'] = json_file['data'][i]['EmpName']
        for key in json_file['data'][i]['data1'].keys():
                try:
                    for j in range(len(json_file['data'][i]['data1'][key])):
                        temp[key]  = json_file['data'][i]['data1'][key][j]['relative']['id'] 
                except:
                    temp[key] = None                    
        temp_df = pd.DataFrame([temp])
        df = pd.concat([df, temp_df], sort=True)

我想要达到的最终输出

 EmpID EmpName XXXX   YYYYY 
 1234  ABC     Naveen  Kumar
 1234  ABC     Nan     Rajesh

但我只得到 1 条记录

 EmpID EmpName XXXX   YYYYY 
 1234  ABC     Naveen  Kumar

请帮我提任何建议

【问题讨论】:

  • ['data']['relTo'] 是什么?
  • @HippolyteBRINGER。嗨,Bringer,在示例记录中添加了更多详细信息。抱歉打错了。
  • 谢谢,您尝试使用 temp 创建一个 csv 文件?你可以创建一个矩阵而不是 dico 吗?
  • @HippolyteBRINGER 是的。我需要将这些数据创建到 csv 文件中。矩阵而不是 Dico 意味着..? (我对 python 完全陌生,请不要介意)。
  • @HippolyteBRINGER -- 如何创建矩阵...?

标签: python json pandas dataframe multi-index


【解决方案1】:

如果你的 json 是这样的:

json_file = {
  "data": [
     {
          "XXXX": [
            {
              "relative": {
                "id": "Naveen"
              }
            }
          ],
          "YYYYY": [
            {
              "relative": {
                "id": "Kumar"
              }
            },
            {
              "relative": {
                "id": "Rajesh"
              }
            }
          ]
    }
     ]
}

下面的代码将结果放入矩阵temp

temp = []
for key in json_file['data'][0].keys():
    for i in json_file['data'][0][key]:
        temp.append([key,i['relative']['id']])

结果是:

[['XXXX', 'Naveen'], ['YYYYY', 'Kumar'], ['YYYYY', 'Rajesh']]

【讨论】:

  • @Bringer ...感谢您的回复。但是没有 Matrix ,这可能吗...?
  • 如果你不想使用矩阵,我认为更好的选择是使用DataFrame
  • @Bringer。是的,我正在尝试仅使用数据框的上述代码。但我无法获得 2 条记录。我只得到一张唱片。请帮助我如何尝试在数据框中实现。
【解决方案2】:

DataFrame 的另一个答案:

df = pd.DataFrame()
for key in json_file['data'][0].keys():
    for j in range(len(json_file['data'][0][key])):
        df.loc[j,key] = json_file['data'][0][key][j]['relative']['id']

结果:


XXXX    YYYYY
0   Naveen  Kumar
1   NaN Rajesh

【讨论】:

  • @Bringer.. 它部分工作,但我面临一个问题。除了这些键之外,我还有其他一些列,我正在手动读取它们并为它们分配顺序。我已经添加了上面的代码。这样改代码后,其他需要重复的Main Columns都要单独记录了。
  • 我正在尝试按顺序分配这些所有列。但是当我尝试 df.loc 时。这 2 条记录作为 2 条记录出现,其他静态列进入 1 条记录(总共变成 3 条记录)
【解决方案3】:
from pandas.io.json import json_normalize
key=list(json_file1['data'][0].keys())
df=pd.concat([json_normalize(json_file1['data'][0][key[0]]),json_normalize(json_file1['data'][0][key[1]])],axis=1)
df=df.ffill()
df.columns=key
df


   XXXX    YYYYY
0   Naveen  Kumar
1   Naveen  Rajesh

为了实现自动化,您可以遍历不同的键

DF={}
key=list(json_file1['data'][0].keys())
for i in range(len(key)):
    df=json_normalize(json_file1['data'][0][key[i]])
    DF[key[i]]=(pd.concat([df],axis=0))
DF1=pd.concat(DF,axis=1)
DF1=DF1.ffill()
DF1.columns=key
DF1

输出

   XXXX   YYYYY    ZZZZZ
0   Naveen  Kumar   Kumar1
1   Naveen  Rajesh  Rajesh1

【讨论】:

  • 实际上我可能有 "ZZZZ" 和 "XXXX" , "YYYY" 。我有 n 个可用的键,但对于示例,我提供了 2 个键。如果不指定像 'XXXX' 这样的键,有没有可能,我可以让它通用吗?
  • 我已经分享了继续处理示例数据的想法。它可以被复制以供进一步查询。我会尝试有一个通用的。希望你发现这个想法有用
  • 非常感谢您的想法。我正在尝试这种方法,我会在几分钟内更新你。但我遇到的一个问题是,正如我所提到的,我可能有“n”个键和同一键的多个记录(就像我为“YYYYY”提供的示例一样)并且我无法指定键[0]和键[1 ] 因为对于某些键,我也可能有 0,1,2。
  • 我已经添加了迭代不同的键,然后在最后连接结果。
  • 什么是错误,上面的代码对我有用。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2019-11-27
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多