python - 在 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]
有什么解决办法吗?
提前致谢。
解决方案
首先通过从该 json初始化一个数据帧并使用and来从该 json 创建一个mappings
字典,然后使用该字典将列表中的每个运动映射到相应的:data
data
DataFrame.set_index
Series.to_dict
mappings
id
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.explode
with 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]
推荐阅读
- solver - 使用 CONOPT4 缩放约束和变量以解决 NLP 问题
- swift - 调用特定的表部分和行以进行备用segue?(以编程方式)
- jquery - 当我的窗口滚动> 50时如何添加:悬停在我的班级.active上
- java - 如何访问索引为长类型的数组元素
- r - S4 对象是否有类似 lapply 的功能?
- c# - ILoggingBuilder Logging LogLevel in Appsettings Json 似乎没有在 Azure 日志流或 Blob 日志中得到确认
- mysql - 如何在 MySQL 控制台中使用环境变量
- c# - HtmlAgilityPack 未找到应该存在的特定节点
- python - 复制 numpy 数组内容而不更改具有不同 dtype 的数组中的值
- ansible - 有条件地运行 ansible 角色处理程序