创建具有单级和多级列的框架并向其添加数据
Create frame wih both single and multi-level columns and add data to it
我有 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)
我的目标是将两个 DataFrames 合二为一,然后添加一些数据行。生成的 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)
我如何使用 concat
、append
或 join
以便我可以向我的空白但完美创建的随机数据行添加 data=[1,2,3,4,5,6,7,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
我有 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)
我的目标是将两个 DataFrames 合二为一,然后添加一些数据行。生成的 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)
我如何使用 concat
、append
或 join
以便我可以向我的空白但完美创建的随机数据行添加 data=[1,2,3,4,5,6,7,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