如何在 Python 中规范化包含列表(应保存为列表)的 json 文件熊猫?

Posted

技术标签:

【中文标题】如何在 Python 中规范化包含列表(应保存为列表)的 json 文件熊猫?【英文标题】:How to normalize json file containing a list (that should be kept as a list) in Python | Pandas? 【发布时间】:2021-03-30 14:59:42 【问题描述】:

我正在尝试使用 json_normalize 函数将 json 文件转换为数据帧。

源 JSON

json 是一个字典列表,看起来像这样:


      "sport_key": "basketball_ncaab",
      "sport_nice": "NCAAB",
      "teams": [
          "Bryant Bulldogs",
          "Wagner Seahawks"
      ],
      "commence_time": 1608152400,
      "home_team": "Bryant Bulldogs",
      "sites": [
          
              "site_key": "marathonbet",
              "site_nice": "Marathon Bet",
              "last_update": 1608156452,
              "odds": 
                  "h2h": [
                      1.28,
                      3.54
                  ]
              
          ,
          
              "site_key": "sport888",
              "site_nice": "888sport",
              "last_update": 1608156452,
              "odds": 
                  "h2h": [
                      1.13,
                      5.8
                  ]
              
          ,
          
              "site_key": "unibet",
              "site_nice": "Unibet",
              "last_update": 1608156434,
              "odds": 
                  "h2h": [
                      1.13,
                      5.8
                  ]
              
          
      ],
      "sites_count": 3
  

问题是未来的列之一包含一个列表(应该是这种情况),但是在 json_normalize 函数的元部分中包含此列会引发以下错误:

ValueError: operands could not be broadcast together with shape (22,) (11,)

当我尝试在以下代码的列表中添加“团队”时出现错误:

pd.json_normalize(data, 'sites', ['sport_key', 'sport_nice', 'home_team', 'teams'])

【问题讨论】:

【参考方案1】:

假设data 是一个字典列表,您仍然可以使用json_normalize,但您必须为data 中的每个对应字典分别分配teams 列:

def normalize(d):
    return pd.json_normalize(d, 'sites', ['sport_key', 'sport_nice', 'home_team'])\
           .assign(teams=[d['teams']]*len(d['sites']))


df = pd.concat([normalize(d) for d in data], ignore_index=True)

你也可以试试:

data = [**d, 'teams': ','.join(d['teams']) for d in data]
df = pd.json_normalize(data, 'sites', ['sport_key', 'sport_nice', 'home_team', 'teams'])
df['teams'] = df['teams'].str.split(',')

结果:

      site_key     site_nice  last_update      odds.h2h         sport_key sport_nice        home_team                               teams
0  marathonbet  Marathon Bet   1608156452  [1.28, 3.54]  basketball_ncaab      NCAAB  Bryant Bulldogs  [Bryant Bulldogs, Wagner Seahawks]
1     sport888      888sport   1608156452   [1.13, 5.8]  basketball_ncaab      NCAAB  Bryant Bulldogs  [Bryant Bulldogs, Wagner Seahawks]
2       unibet        Unibet   1608156434   [1.13, 5.8]  basketball_ncaab      NCAAB  Bryant Bulldogs  [Bryant Bulldogs, Wagner Seahawks]

【讨论】:

谢谢,第二个建议解决了我的问题!

以上是关于如何在 Python 中规范化包含列表(应保存为列表)的 json 文件熊猫?的主要内容,如果未能解决你的问题,请参考以下文章

将最大值设置为列

python 在列表中查找包含所以某个字符串的项,并保存到一个新的列表

如何将列表项显示为列?

如何在 Databricks 中使用 Python 将数据框数组拆分为列

当 Python 只应附加到一个列表时,它会附加到两个列表

将包含许多嵌套对象的JSON文件保存到列表中