创建具有单级列和多级列的框架并向其中添加数据

时间:2018-08-22 15:53:34

标签: python-3.x pandas multi-level

我有2个这样的数据框

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)

我的目标是将两个DataFrame合并为一个,然后添加一些数据行。最终的DataFrame就像

  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

我想要的是成为“ Peter”一栏,而不是像我得到的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)

如何使用concatappendjoin,以便可以将data=[1,2,3,4,5,6,7,8]之类的随机数据行添加到我的空白但创建完美的最终帧中?

谢谢你,问候

1 个答案:

答案 0 :(得分:1)

您要使用空字符串向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