Python 重塑数据框以反映隐含的x值?
如果列的子集是某些x值的y值,如何重塑数据帧Python 重塑数据框以反映隐含的x值?,python,pandas,dataframe,pivot-table,Python,Pandas,Dataframe,Pivot Table,如果列的子集是某些x值的y值,如何重塑数据帧 df_record = pd.DataFrame({ 'date' : ['2019-03-17', '2019-03-17', '2019-03-17', '2019-03-17'], 'id' : ['a', 'a', 'b', 'b'], 'meta' : ['A', 'B', 'A', 'B'], 'y11' : [0.1, 0.2, 0.3, 0.4], 'y12' : [1, 2, 3, 4],
df_record = pd.DataFrame({
'date' : ['2019-03-17', '2019-03-17', '2019-03-17', '2019-03-17'],
'id' : ['a', 'a', 'b', 'b'],
'meta' : ['A', 'B', 'A', 'B'],
'y11' : [0.1, 0.2, 0.3, 0.4],
'y12' : [1, 2, 3, 4],
'y21' : [10, 20, 30, 40],
'y22' : [100, 200, 300, 400],
})
在此示例中,y12、y12、y21和y22对应于例如[10,20100200]。
我可以将其添加到每行:
xs = [10,20,100,200]
df_ = pd.DataFrame()
for i in range(len(df_record)):
xs_ = pd.Series(xs, name=i)
df_ = pd.concat([df_, xs_], axis=1)
df_['xs'] = [ 'x%i'%i for i in xs ]
pd_ = pd.concat([df_record, df_.set_index('xs').T], axis=1)
其中打印:
date id meta y11 y12 y21 y22 x10 x20 x100 x200
0 2019-03-17 a A 0.1 1 10 100 10 20 100 200
1 2019-03-17 a B 0.2 2 20 200 10 20 100 200
2 2019-03-17 b A 0.3 3 30 300 10 20 100 200
3 2019-03-17 b B 0.4 4 40 400 10 20 100 200
但现在我迷路了。我非常确定类似于df_u2;.pivot()
的东西应该有助于我反映结构,也就是说,xs是一个像['date','id','meta','xs']
这样的索引级别
提前谢谢
PS.如何从Jupyter NB发布上述命令的结果?您可以使用指定的索引和列值创建新的
数据帧
,并将其转换为原始:
xs = [10,20,100,200]
cols = [f'x{x}' for x in xs]
df = df_record.join(pd.DataFrame([xs], index=df_record.index, columns=cols))
print (df)
date id meta y11 y12 y21 y22 x10 x20 x100 x200
0 2019-03-17 a A 0.1 1 10 100 10 20 100 200
1 2019-03-17 a B 0.2 2 20 200 10 20 100 200
2 2019-03-17 b A 0.3 3 30 300 10 20 100 200
3 2019-03-17 b B 0.4 4 40 400 10 20 100 200
然后通过以下方式重塑:
如果需要删除列变量
:
df1 = df1.drop('variable',axis=1)
print (df1.head())
id date meta xs
0 a 2019-03-17 A 0.1
1 a 2019-03-17 B 0.2
2 b 2019-03-17 A 0.3
3 b 2019-03-17 B 0.4
4 a 2019-03-17 A 1.0
编辑:
对于指定列,可以使用:
df - pd.melt(df_concat,
id_vars=['id', 'date', 'meta'],
value_vars=['y11', 'y12', 'y21', 'y22'],
var_name='ys',
value_name='xs')
那看起来正是我要找的!我明天会用真实的数据试试,如果没有的话,我会回来的。谢谢!
df - pd.melt(df_concat,
id_vars=['id', 'date', 'meta'],
value_vars=['y11', 'y12', 'y21', 'y22'],
var_name='ys',
value_name='xs')