Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重塑数据框以反映隐含的x值?_Python_Pandas_Dataframe_Pivot Table - Fatal编程技术网

Python 重塑数据框以反映隐含的x值?

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],

如果列的子集是某些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_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')