【问题标题】:parse a dict from the csv file python从 csv 文件 python 解析一个字典
【发布时间】:2020-06-05 13:38:19
【问题描述】:

我正在从 csv 文件中读取数据,例如:

import pandas as pd
data_1=pd.read_csv("sample.csv")
data_1.head(10)

它有两列:

ID   detail
1    [{'a': 1, 'b': 1.85, 'c': 'aaaa', 'd': 6}, {'a': 2, 'b': 3.89, 'c': 'bbbb', 'd': 10}]

detail 列不是 json,但它是 dict,我想展平 dict 并希望得到类似这样的结果:

ID  a   b     c     d
1   1   1.85  aaaa  6
1   2   3.89  bbbb  10

我总是在detail列得到a,b,c,d,想把最终结果移到sql表中。

谁能帮我解决一下。

【问题讨论】:

    标签: python pandas dictionary parsing flatten


    【解决方案1】:

    使用字典理解和ast.literal 将字符串repr 转换为dicts 列表并将其转换为DataFrame,然后使用concat 并将MultiIndex 的第一级转换为ID 列:

    import ast
    
    d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].to_numpy()}
    #for oldier pandas version use .values
    #d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].values)}
    df = pd.concat(d).reset_index(level=1, drop=True).rename_axis('ID').reset_index()
    print (df)
       ID  a     b     c   d
    0   1  1  1.85  aaaa   6
    1   1  2  3.89  bbbb  10
    

    或者对 ID 列使用带有 DataFrame.assign 的 lsit 理解,只需要更改列的顺序 - 最后一列到第一列:

    import ast
    
    L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].to_numpy()]
    #for oldier pandas versions use .values
    #L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].values]
    df = pd.concat(L, ignore_index=True)
    df = df[df.columns[-1:].tolist() + df.columns[:-1].tolist()]
    print (df)
       ID  a     b     c   d
    0   1  1  1.85  aaaa   6
    1   1  2  3.89  bbbb  10
    

    编辑:

    对于 2 个 ID 更改第二个解决方案:

    d = [pd.DataFrame(ast.literal_eval(d)).assign(ID1=i1, ID2=i2) for i1, i2, d in df[['ID1','ID2','detail']].to_numpy()]
    df = pd.concat(d)
    df = df[df.columns[-2:].tolist() + df.columns[:-2].tolist()]
    

    【讨论】:

    • 我收到错误,例如 'DataFrame' 对象没有属性 'to_numpy'
    • @xhang - 答案已编辑,需要.values 而不是.to_numpy()
    • 感谢 jezrael 但它会抛出错误 TypeError: 'numpy.ndarray' object is not callable
    • @xhang - 你使用.values 而不使用() 吗?
    • 很酷,非常感谢它就像一个魅力,只是一个后续问题假设我有两个键,你能帮忙在这里做什么 df[['ID1','ID2' ,'详细']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2012-10-13
    • 2022-07-04
    相关资源
    最近更新 更多