首页 > 解决方案 > 在 Pandas DataFrame 列中的列表中映射 JSON

问题描述

我正在尝试转换整数列表中的字符串列表,将其 id 关联到数据框列中。

那是因为我需要为每个 id 映射一个运动列表,就像下一个节目一样。有些运动不在 JSON 中。在这种情况下,有必要使用整数列表列删除所需数据框中的该元素。

那是我必须映射的 JSON:

[ 
   {
     "id": 1,
     "name": "Karate",
   }, 
   {
      "id": 2,
      "name": "Paintball",
   },
   {
      "id": 3,
      "name": "Rugby",
   },
   {
      "id": 4,
      "name": "Squash",
   },
   {
      "id": 5,
      "name": "Softball",
   },
   {
      "id": 6,
      "name": "Swimiming",
   },
   {
      "id": 7,
      "name": "Weighlifting",
   },
   {
      "id": 8,
      "name": "Table Tennis",
   },
   {
      "id": 9,
      "name": "Tenpin Bowling",
   }
]

这就是我拥有的数据框,其中包含不在 JSON 中的运动。

id        sports             
111       ['Softball', 'Table Tennis', 'Rafting']                     
222       ['Rugby', 'Tenpin Bowling','Squash'] 
333       ['Weighlifting', 'Tennis', 'Swimiming'] 
444       ['Softball', 'Table Tennis', 'Paintball']
555       ['Rugby', 'Tenpin Bowling','Squash']
666       ['Weighlifting', 'Karate', 'Swimiming']
777       ['Softball', 'Table Tennis', 'Soccer'] 
888       ['Basketball', 'Tenpin Bowling','Squash']
999       ['Weighlifting', 'Karate', 'Swimiming']

这就是我需要的数据框,没有无法在 JSON 中映射的运动。

id        sports             
111       [5, 8]                     
222       [3, 9, 4] 
333       [7, 6] 
444       [5, 8, 2]
555       [3, 9, 4]
666       [7, 1, 6] 
777       [5, 8] 
888       [9, 4]
999       [7, 1, 6]

有什么解决办法吗?

提前致谢。

标签: pythonpandasdataframe

解决方案


首先通过从该 json初始化一个数据帧并使用and来从该 json 创建一个mappings字典,然后使用该字典将列表中的每个运动映射到相应的:datadataDataFrame.set_indexSeries.to_dictmappingsid

mappings = pd.read_json(data).set_index('name')['id'].to_dict()
df['sports'] = [[mappings[key] for key in lst if key in mappings] for lst in df['sports']]

或者,也可以使用Series.explodewith Series.map,但这种方法通常较慢

mappings = pd.read_json(data).set_index('name')['id']
df['sports'] = (
    df['sports'].explode()
    .map(mappings).dropna().astype(int).groupby(level=0).agg(list)
)

结果:

# print(df)
    id     sports
0  111     [5, 8]
1  222  [3, 9, 4]
2  333     [7, 6]
3  444  [5, 8, 2]
4  555  [3, 9, 4]
5  666  [7, 1, 6]
6  777     [5, 8]
7  888     [9, 4]
8  999  [7, 1, 6]

推荐阅读