Python 数据框列中的词典列表

Python 数据框列中的词典列表,python,json,list,Python,Json,List,我在DataFrame中有一列,其中包含JSON字符串,每个字符串表示一个字典列表: id Number Type Class Name

我在
DataFrame
中有一列,其中包含JSON字符串,每个字符串表示一个字典列表:

    id Number  Type  Class Name                                                                                                                                                                                                                                datiles
0  292      C     1      2    A  [{"did":{"id":"3","num":1},"NId":"a1,b1,c1","Att":null,"isnull":false,"number":"M90","label":[{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}],"codes":[],"rule":null}]
1  293      C     1      2    A  [{"did":{"id":"3","num":1},"NId":"a1,b1,c1","Att":null,"isnull":false,"number":"M90","label":[{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}],"codes":[],"rule":null}]
我想将datiles列中的每一行转换为行和列,并将它们与原始数据框连接起来,如下面的示例所示:

       id     Number       Type     Class      Name            did                NId        Att  ..... .... label ........
      0292           C          1          2        A     {"id":"3","num":1}    a1,b1,c1    null    [{"title":"Dear","Info"{"Id":null,"id2":2,"Name":"x"}},{"title":"Dear","Info":{"Id":null,"id2":2,"Name":"x"}}]
我已经按需要完成了此操作,但我不知道如何将其与原始数据帧连接,因为它们之间没有密钥:

df['datiles']=data['datiles'].apply(json.loads)

df2 = pd.DataFrame([])

for x in df['datiles'].values.tolist():
    df2 = df2 .append(pd.DataFrame(x))
display(df2)
如何拆分列并同时联接? 我曾尝试使用json_normalize,但我遇到了这个错误

AttributeError: 'list' object has no attribute 'values'
另外,我也看到过这些帖子,但不起作用,可能是因为列表结构


您可以使用
df
的索引,并将其显式设置为要加入的新
数据帧,如下所示:

df['datiles'] = df['datiles'].apply(json.loads).apply(pd.DataFrame)
out = df.drop('datiles', axis=1).join(
    pd.concat(df['datiles'].values, keys=df.index).droplevel(1))
解释

  • 第一行执行双重
    apply
    json.loads
    (如您所知)和
    pd.DataFrame
    (您也已了解,但这里我们在
    apply
    而不是循环中执行)
  • 第二行包含
    df['datiles']
    内部的所有
    DataFrames
    ,但使用
    df
    本身的索引作为键。结果是一个
    多索引
    ,对于给定的键可能有几行(如果原始
    datiles
    JSON字符串是一个包含多个元素的列表)。在任何情况下,我们都会放弃第二级。然后,
    join
    执行其通常的操作(在索引上)
  • 示例

    对于SO答案,设置有点冗长(我希望我们有一个
    展开
    折叠
    宏),所以我粘贴了它

    关键是,第一个
    datiles
    是一个包含两个元素的JSON列表,只是为了执行上面的逻辑。除此之外,它的内容与OP相同

    输出

        id Number  Type  Class Name                    did       NId   Att  \
    0  292      C     1      2    A  {'id': '1', 'num': 1}  a1,b1,c1  None   
    0  292      C     1      2    A  {'id': '2', 'num': 1}  a1,b1,c1  None   
    1  293      C     1      2    A  {'id': '3', 'num': 1}  a1,b1,c1  None   
    
       isnull number                                              label codes  \
    0   False    M90  [{'title': 'Dear', 'Info': {'Id': None, 'id2':...    []   
    0   False    M90  [{'title': 'Dear', 'Info': {'Id': None, 'id2':...    []   
    1   False    M90  [{'title': 'Dear', 'Info': {'Id': None, 'id2':...    []   
    
       rule  
    0  None  
    0  None  
    1  None
    

    第一个数据帧的副本中存在打字错误
    “Info”{“Id”:null,…
    不是一个
    dict
    也不是有效的JSON。那列
    datiles
    真的包含
    dict
    s吗?我怀疑它,在我看来更像是JSON字符串(按排印模式)。它起作用了,谢谢