如何根据json文件

时间:2017-10-25 18:25:37

标签: json pandas dataframe

我想练习构建模型,我想我会用我熟悉的东西来做:英雄联盟。我在使用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]'

我不确定这是否是最有效的方法,但我也不确定如何做到这一点。

你们都在想什么?

谢谢!

2 个答案:

答案 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'])