重塑数据帧以反映隐含的xvalus?

2024-06-24 13:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

如果列的子集是某些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],
    '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_.pivot()的内容应该有助于反映结构,即xs是一个类似['date', 'id', 'meta', 'xs']的索引级别

提前谢谢

另外,我如何从Jupyter NB发布上述命令的结果


Tags: iniddataframedffordaterecordmeta
1条回答
网友
1楼 · 发布于 2024-06-24 13:23:31

可以使用指定的索引和列值创建新的DataFrame,并将^{}创建为原始值:

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 = df.melt(['id', 'date', 'meta'], value_name='xs')
print (df1.head())
  id        date meta variable   xs
0  a  2019-03-17    A      y11  0.1
1  a  2019-03-17    B      y11  0.2
2  b  2019-03-17    A      y11  0.3
3  b  2019-03-17    B      y11  0.4
4  a  2019-03-17    A      y12  1.0

如果需要删除列variable

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')

相关问题 更多 >