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

创建包含单层和多层列的框架并向其添加数据

  •  1
  • puppet  · 技术社区  · 8 年前

    我有两个这样的数据帧

    frame1=pd.DataFrame(columns=['A','B','C'])
    
    
    a=['d1','d2','d3']
    b=['d4','d5']
    tups=([('T1',x) for x in a]+
      [('T2',x) for x in b])
    
    cols=pd.MultiIndex.from_tuples(tups,names=['Trial','Data'])
    frame2=pd.DataFrame(columns=cols)
    

    我的目标是将两个数据帧放在一起,然后添加一些数据行。生成的数据帧如下

      Trial    A   B   C        T1         T2
      Data                  d1  d2  d3   d4  d5
    0          1   2   3    4   5   6    7   8
    1           ...     
    ...
    

    如果我能做到的话

    frame2['A']=1
    frame2['B']=2
    frame2['C']=3
    

    但这不是一个干净的解决方案,我无法创建框架,然后添加数据,因为我至少需要手动插入第一行。

    我试过了

    frame3=frame1.join(frame2)
    
    >>  A1   A2   A3 (T1, d1) (T1, d2) (T1, d3) (T2, d4) (T2, d5)
    

    我认为这不是多栏水平。

    tup2=([('A1',),('A2',),('A3',)]+[('T1',x) for x in a]+
      [('T2',x) for x in b])
    cols2=pd.MultiIndex.from_tuples(tup2,names=['Trial','Data'])
    data=[1,2,3,4,5,6,7,8]
    frame20=pd.DataFrame(data,index=cols2).T 
    
     Trial  A1  A2  A3 T1       T2    
     Data   NaN NaN NaN d1 d2 d3 d4 d5      
    0        1   2   3  4  5  6  7  8
    

    这个在尝试查询时很好用 frame20.loc[0,'A1'][0] 但如果我是

    frame20['Peter']=1234
    >Trial  A1  A2  A3 T1       T2      Peter
     Data   NaN NaN NaN d1 d2 d3 d4 d5      
    0        1   2   3  4  5  6  7  8   1234
    

    作为专栏“彼得”我的愿望,而不是例如A1,这是我得到的。

    tup3=(['A','B','C']+[('T1',x) for x in a]+
      [('T2',x) for x in b])
    cols3=pd.MultiIndex.from_tuples(tup3,names=['Trial','Data'])
    frame21=pd.DataFrame(data,index=cols3).T
    

    返回的结果与第二个完全相同。

    所以,我要找的是

    pd.DataFrame(rows_of_data,index=alfa).T  #or
    pd.DataFrame(rows_of_data,columns=beta)
    

    其中alfa或beta的格式都是正确的。

    另外,作为奖励,我终于想出了一个办法

    finalframe=pd.DataFrame(columns=beta)
    

    我该怎么用 concat , append 或 join 所以我可以随机添加一行数据,比如 data=[1,2,3,4,5,6,7,8] 到我空荡荡的完美结局?

    谢谢,致以最诚挚的问候

    1 回复  |  直到 8 年前
        1
  •  1
  •   piRSquared    8 年前

    您要将级别添加到 frame1

    pandas.MultiIndex.from_tuples

    idx = pd.MultiIndex.from_tuples([(c, '') for c in frame1])
    f1 = frame1.set_axis(idx, axis=1, inplace=False)
    frame3 = pd.concat([f1, frame2], axis=1)
    
    frame3.reindex([0, 1])
    
         A    B    C   T1             T2     
                       d1   d2   d3   d4   d5
    0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    

    pandas.concat

    frame3 = pd.concat([
        pd.concat([frame1], keys=[''], axis=1).swaplevel(0, 1, 1),
        frame2], axis=1)
    
    frame3.reindex([0, 1])
    
         A    B    C   T1             T2     
                       d1   d2   d3   d4   d5
    0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN