我想练习构建模型,我想我会用我熟悉的东西来做:英雄联盟。我在使用json中的值替换数据帧中的整数时遇到问题。
我正在使用的数据集来自kaggle。你可以抓住它并自己运行它。
https://www.kaggle.com/datasnaek/league-of-legends
我有以下形式的json文件:(它实际上必须更大,但我缩短了它)
{
"type": "champion",
"version": "7.17.2",
"data": {
"1": {
"title": "the Dark Child",
"id": 1,
"key": "Annie",
"name": "Annie"
},
"2": {
"title": "the Berserker",
"id": 2,
"key": "Olaf",
"name": "Olaf"
}
}
}
和表单的数据框
print df
gameDuration t1_champ1id
0 1949 1
1 1851 2
2 1493 1
3 1758 1
4 2094 2
我想用tson中的查找值替换t1_champ1id中的ID。
如果这两个都是数据帧,那么我可以使用合并选项。
这是我尝试过的。我不知道这是否是读取json文件的最佳方式。
import pandas
df = pandas.read_csv("lol_file.csv",header=0)
champ = pandas.read_json("champion_info.json", typ='series')
for i in champ.data[0]:
for j in df:
if df.loc[j,('t1_champ1id')] == i:
df.loc[j,('t1_champ1id')] = champ[0][i]['name']
我收到以下错误:
标签[gameDuration]不在[index]'
中
我不确定这是否是最有效的方法,但我也不确定如何做到这一点。
你们都在想什么?
谢谢!
答案 0 :(得分:1)
for j in df:
遍历df
中的列名称,这是不必要的,因为您只想匹配列't1_champ1id'
。更好地使用pandas功能是将jSON文件中的id:name对压缩到字典中,然后将其映射到df['t1_champ1id']
。
player_names = {v['id']:v['name'] for v in json_file['data'].itervalues()}
df.loc[:, 't1_champ1id'] = df['t1_champ1id'].map(player_names)
# gameDuration t1_champ1id
# 0 1949 Annie
# 1 1851 Olaf
# 2 1493 Annie
# 3 1758 Annie
# 4 2094 Olaf
答案 1 :(得分:0)
根据'数据创建数据框。在json文件中(也转换结果数据帧,然后将索引设置为你要映射的内容,id)然后将其映射到原始df。
import json
with open('champion_info.json') as data_file:
champ_json = json.load(data_file)
champs = pd.DataFrame(champ_json['data']).T
champs.set_index('id',inplace=True)
df['champ_name'] = df.t1_champ1id.map(champs['name'])