代码之家  ›  专栏  ›  技术社区  ›  OD1995

将字典项转换为数据帧的行,其中键是元组,值是整数

  •  3
  • OD1995  · 技术社区  · 7 年前

    我有一本字典如下:

    d = {("Sam","Scotland","23") : 25,
         ("Oli","England","23") : 28,
         ("Ethan","Wales","18") : 19}
    

    我想把它转换成一个熊猫数据帧,它看起来像这样:

    Name    Country    Age    Count
    Sam     Scotland    23     25
    Oli     England     23     28
    Ethan   Wales       18     19
    

    df = pd.DataFrame.from_items(d.items(),orient="index",
                                  columns=["Name","Country","Age","Count"])
    

    但我有个错误:

    ValueError: The value in each (key, value) pair must be an array, Series, or dict
    

    我很感激通过循环元组的每一项和每一个元素是可能的,但是有没有更干净的方法呢?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Dani Mesejo    7 年前

    您可以通过连接键和值来手动构建DataFrame的行,例如:

    import pandas as pd
    
    d = {("Sam", "Scotland", "23"): 25,
         ("Oli", "England", "23"): 28,
         ("Ethan", "Wales", "18"): 19}
    
    df = pd.DataFrame([k + (v,) for k, v in d.items()], columns=['name', 'country', 'age', 'count'])
    print(df)
    

    输出

        name   country age  count
    0  Ethan     Wales  18     19
    1    Sam  Scotland  23     25
    2    Oli   England  23     28
    

    或者作为替代:

    import pandas as pd
    
    d = {("Sam", "Scotland", "23"): 25,
         ("Oli", "England", "23"): 28,
         ("Ethan", "Wales", "18"): 19}
    
    df = pd.DataFrame(
        [{"name": name, "country": country, "age": age, "count": value} for (name, country, age), value in d.items()])
    
    print(df)
    

    输出

      age  count   country   name
    0  23     28   England    Oli
    1  23     25  Scotland    Sam
    2  18     19     Wales  Ethan
    

    其思想是将键值对转换为字典列表,然后将其传递给 DataFrame .

        2
  •  2
  •   jpp    7 年前

    你可以用 pd.DataFrame.from_dict 带着字典 直接地 tuple 从您的输入字典键。你可以把它转换成 MultiIndex reset_index

    cols = ['Name', 'Country', 'Age', 'Count']
    
    df = pd.DataFrame.from_dict(d, orient='index', columns=cols[-1])
    df.index = pd.MultiIndex.from_tuples(df.index, names=cols[:-1])
    df = df.reset_index()