Python 从中的json列提取的值创建数据帧

Python 从中的json列提取的值创建数据帧,python,pandas,Python,Pandas,我将一个.csv文件加载到df中,列的一行包含一个字典列表,如下所示 data = [{"character": "Jake Sully", "gender": 2,}, {"character": "Neytiri", "gender": 1}, {"character": "Dr. Grace Augustine","gender": 1},

我将一个.csv文件加载到df中,列的一行包含一个字典列表,如下所示

data = [{"character": "Jake Sully", "gender": 2,}, {"character": "Neytiri", "gender": 1},                                                         
        {"character": "Dr. Grace Augustine","gender": 1},         
        {"character": "Col. Quaritch", "gender": 2]
当然,在加载它之后,它会被读取为字符串。因此,我将列中的每一行转换为json,这使得基于键名提取值变得很容易。然后我需要像这样创建一个单独的df

df = {'character': ['Jake Sully','Neytiri', 'Dr. Grace Augustine', 'Col.Quaritch'], 
    'gender': [2, 1, 1, 2]} 
这是我的代码,但我不能完全正确地获得所需的df输出

df = pd.DataFrame() #create new df
keys = ['character','gender'] #keys to extract values from json
lst=[]
for val in data: #to iterate over data series
    for object in json.loads(val):
        for key in keys:
            lst.append(object[key])
    df = pd.concat([df,pd.DataFrame(lst,columns=[key])], axis=1)

有人能告诉我我做错了什么吗?

pd.DataFrame
直接接受字典列表:

data = [{"character": "Jake Sully", "gender": 2,},
        {"character": "Neytiri", "gender": 1},
        {"character": "Dr. Grace Augustine","gender": 1},
        {"character": "Col. Quaritch", "gender": 2}]

df = pd.DataFrame(data)  # or pd.DataFrame.from_dict(data)

print(df)

             character  gender
0           Jake Sully       2
1              Neytiri       1
2  Dr. Grace Augustine       1
3        Col. Quaritch       2
因此,您只需要从json文件中提取字典列表。一种方法是通过
json.loads


更好的方法是通过
pd将数据直接读取到数据框中。read_json

pd。数据框
直接接受字典列表:

data = [{"character": "Jake Sully", "gender": 2,},
        {"character": "Neytiri", "gender": 1},
        {"character": "Dr. Grace Augustine","gender": 1},
        {"character": "Col. Quaritch", "gender": 2}]

df = pd.DataFrame(data)  # or pd.DataFrame.from_dict(data)

print(df)

             character  gender
0           Jake Sully       2
1              Neytiri       1
2  Dr. Grace Augustine       1
3        Col. Quaritch       2
因此,您只需要从json文件中提取字典列表。一种方法是通过
json.loads


一个更好的方法是通过pd将数据直接读入数据框。阅读json我可能不完全理解你的问题,但我可以很好地理解df

data = [{"character": "Jake Sully", "gender": 2,}, 
         {"character": "Neytiri", "gender": 1},
         {"character": "Dr. Grace Augustine","gender": 1},
         {"character": "Col. Quaritch", "gender": 2}]

pd.DataFrame(data)
输出:


我可能不完全理解你的问题,但我能很好地理解你的问题

data = [{"character": "Jake Sully", "gender": 2,}, 
         {"character": "Neytiri", "gender": 1},
         {"character": "Dr. Grace Augustine","gender": 1},
         {"character": "Col. Quaritch", "gender": 2}]

pd.DataFrame(data)
输出:

我明白了

df = pd.DataFrame() #create new df
keys = ['character','gender'] #keys to extract values from json
for i,key in enumerate(keys):
     lst_i = []
     for row in data: #iterating over the rows in the cols of interest 
          for object in json.loads(row):
              lst_i.append(object[key])
     df = pd.concat([df,pd.DataFrame(lst_i,columns=[key])], axis=1)
我明白了

df = pd.DataFrame() #create new df
keys = ['character','gender'] #keys to extract values from json
for i,key in enumerate(keys):
     lst_i = []
     for row in data: #iterating over the rows in the cols of interest 
          for object in json.loads(row):
              lst_i.append(object[key])
     df = pd.concat([df,pd.DataFrame(lst_i,columns=[key])], axis=1)

谢谢,但正如我提到的,该文件是一个.csv文件,其中包含一列字典列表。在pd.read_csv('filename.csv')之后,我确实在上面的代码中使用了json.loads。我使用了,但是我得到了一个ValueError:预期的对象或值。这就是为什么我加载为pd.read\u csv('filename.csv'),之后我迭代列中的每一行,然后使用json.loads(row\u in\u col\u on\u inters)。对不起!打字错误V实际上是数据中val的迭代器val:have updated它。@Zoozoo,您可以尝试在您的问题中包括
pd.read\u csv('filename.csv')。to\u dict()
。谢谢,但正如我提到的,该文件是一个.csv文件,其中包含一列字典列表。在pd.read_csv('filename.csv')之后,我确实在上面的代码中使用了json.loads。我使用了,但是我得到了一个ValueError:预期的对象或值。这就是为什么我加载为pd.read\u csv('filename.csv'),之后我迭代列中的每一行,然后使用json.loads(row\u in\u col\u on\u inters)。对不起!打字错误V实际上是数据中val的迭代器val:have updated它。@Zoozoo,您可以尝试在您的问题中包括
pd.read\u csv('filename.csv')。to\u dict()
。数据只代表感兴趣列的一行。这是为了显示在我使用pd.read_csv('filename.csv')加载.csv文件后,此列将作为字符串加载。数据仅表示感兴趣的列中的一行。这是为了显示在我使用pd.read_csv('filename.csv')加载.csv文件后,此列将作为字符串加载。