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

从奇数字典填充熊猫数据帧

  •  2
  • user32882  · 技术社区  · 6 年前

    我有一本字典如下:

    {'header_1': ['body_1', 'body_3', 'body_2'],
     'header_2': ['body_6', 'body_4', 'body_5'],
     'header_4': ['body_7', 'body_8'],
     'header_3': ['body_9'],
     'header_9': ['body_10'],
     'header_10': []}
    

    我想提出一个这样的数据框架:

    +----+----------+--------+
    | ID | header   | body   |
    +----+----------+--------+
    | 1  | header_1 | body_1 |
    +----+----------+--------+
    | 2  | header_1 | body_3 |
    +----+----------+--------+
    | 3  | header_1 | body_2 |
    +----+----------+--------+
    | 4  | header_2 | body_6 |
    +----+----------+--------+
    | 5  | header_2 | body_4 |
    +----+----------+--------+
    | 6  | header_2 | body_5 |
    +----+----------+--------+
    | 7  | header_4 | body_7 |
    +----+----------+--------+
    

    其中空白项(如用于键 header_10 在上面的dict中)将收到一个值 None . 我试过很多种 df.loc 例如:

    for header_name, body_list in all_unique.items():
        for body_name in body_list:
            metadata.loc[metadata.index[-1]] = [header_name, body_name]
    

    无济于事。肯定有一条捷径 panadas 要追加行并自动增加索引吗?类似于SQL的东西 INSERT INTO 只使用蟒蛇代码的语句?

    谢谢。

    3 回复  |  直到 6 年前
        1
  •  6
  •   jezrael    6 年前

    对加法使用听写理解 None s表示空列表,然后扁平表示元组列表:

    d = {'header_1': ['body_1', 'body_3', 'body_2'],
     'header_2': ['body_6', 'body_4', 'body_5'],
     'header_4': ['body_7', 'body_8'],
     'header_3': ['body_9'],
     'header_9': ['body_10'],
     'header_10': []}
    
    d = {k: v if bool(v) else [None] for k, v in d.items()}
    data = [(k, y) for k, v in d.items() for y in v]
    df = pd.DataFrame(data, columns= ['a','b'])
    print (df)
                a        b
    0    header_1   body_1
    1    header_1   body_3
    2    header_1   body_2
    3    header_2   body_6
    4    header_2   body_4
    5    header_2   body_5
    6    header_4   body_7
    7    header_4   body_8
    8    header_3   body_9
    9    header_9  body_10
    10  header_10     None
    

    另一个解决方案:

    data = []
    for k, v in d.items():
        if bool(v):
            for y in v:
                data.append((k, y))
        else:
            data.append((k, None))
    
    
    df = pd.DataFrame(data, columns= ['a','b'])
    print (df)
                a        b
    0    header_1   body_1
    1    header_1   body_3
    2    header_1   body_2
    3    header_2   body_6
    4    header_2   body_4
    5    header_2   body_5
    6    header_4   body_7
    7    header_4   body_8
    8    header_3   body_9
    9    header_9  body_10
    10  header_10     None
    
        2
  •  2
  •   Polkaguy6000    6 年前

    如果数据集太大,这个解决方案会很慢,但它仍然可以工作。

    for key in data.keys():
        vals= data[key]
        # Create temp df with data from a single key
        t_df = pd.DataFrame({'header':[key]*len(vals),'body':vals})
    
        # Append it to your full dataframe.
        df = df.append(t_df)
    
        3
  •  2
  •   BENY    6 年前

    这是另一个 unnesting 问题再次

    借杰兹为你的 d

    d = {k: v if bool(v) else [None] for k, v in d.items()}
    

    首先将听写转换为数据帧

    df=pd.Series(d).reset_index()
    df.columns
    Out[204]: Index(['index', 0], dtype='object')
    

    然后在 here

    yourdf=unnesting(df,[0])
    yourdf
    Out[208]: 
             0      index
    0   body_1   header_1
    0   body_3   header_1
    0   body_2   header_1
    1   body_6   header_2
    1   body_4   header_2
    1   body_5   header_2
    2   body_7   header_4
    2   body_8   header_4
    3   body_9   header_3
    4  body_10   header_9
    5     None  header_10
    

    def unnesting(df, explode):
        idx=df.index.repeat(df[explode[0]].str.len())
        df1=pd.concat([pd.DataFrame({x:np.concatenate(df[x].values)} )for x in explode],axis=1)
        df1.index=idx
        return df1.join(df.drop(explode,1),how='left')