【问题标题】:Creating a dataframe from values extracted from a json column in Pandas从 Pandas 中的 json 列中提取的值创建数据框
【发布时间】:2018-06-06 10:29:20
【问题描述】:

我将一个 .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)

谁能告诉我我做错了什么?

【问题讨论】:

标签: python pandas


【解决方案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 将数据直接读入数据帧。

【讨论】:

  • 谢谢,但正如我所提到的,该文件是一个 .csv 文件,其中包含一列是字典列表。在 pd.read_csv('filename.csv') 之后,我确实在上面的代码中使用了 json.loads。
  • 我做了,但我得到一个 ValueError: Expected object or value。这就是为什么我加载为 pd.read_csv('filename.csv'),之后我遍历列中的每一行,然后使用 json.loads(row_in_col_on_interst)。
  • 对不起!错字。 V 实际上是迭代器 val in for val in data: 已经更新了。
  • @Zoozoo,您可以尝试在您的问题中包含pd.read_csv('filename.csv').to_dict()
【解决方案2】:

我可能不完全理解你的问题,但我能够得到 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)

输出:

             character       gender
0           Jake Sully       2
1              Neytiri       1
2  Dr. Grace Augustine       1`

【讨论】:

  • 数据仅代表感兴趣列的一行。这是为了表明在我使用 pd.read_csv('filename.csv') 加载 .csv 文件后,此列被加载为字符串。
【解决方案3】:

想通了。

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)

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 2020-04-01
    • 2019-02-03
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2015-10-12
    • 2021-07-18
    相关资源
    最近更新 更多