Pandas 数据帧中特定列的透视

Pandas 数据帧中特定列的透视,pandas,dataframe,Pandas,Dataframe,我想在熊猫数据帧上应用一种透视类型,但找不到正确的方法 我想做的是: 输入_df: p_id p_name prod_t1 prod_t2 prod_t3 ----------------------------------- 1 foo 3 2 4 2 bar 0 1 0 p_id p_name prod_time quantity ----------------------------------- 1 foo

我想在熊猫数据帧上应用一种透视类型,但找不到正确的方法

我想做的是:

输入_df

p_id p_name prod_t1 prod_t2 prod_t3
-----------------------------------
1    foo    3       2       4
2    bar    0       1       0
p_id p_name prod_time quantity
-----------------------------------
1    foo    prod_t1   3
1    foo    prod_t2   2
1    foo    prod_t3   4
2    bar    prod_t1   0
2    bar    prod_t2   1
2    bar    prod_t3   0
预期的输出\u df

p_id p_name prod_t1 prod_t2 prod_t3
-----------------------------------
1    foo    3       2       4
2    bar    0       1       0
p_id p_name prod_time quantity
-----------------------------------
1    foo    prod_t1   3
1    foo    prod_t2   2
1    foo    prod_t3   4
2    bar    prod_t1   0
2    bar    prod_t2   1
2    bar    prod_t3   0
这是熔化:

df.melt(id_vars=['p_id','p_name'],
        var_name='prod_time', 
        value_name='quantity')
输出:

   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     2    bar   prod_t1         0
2     1    foo   prod_t2         2
3     2    bar   prod_t2         1
4     1    foo   prod_t3         4
5     2    bar   prod_t3         0
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0
或者这可以是
堆栈

(df.set_index(['p_id','p_name'])
   .stack().reset_index()
   .rename(columns={'level_2':'prod_time', 0:'quantity'})
)
输出:

   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     2    bar   prod_t1         0
2     1    foo   prod_t2         2
3     2    bar   prod_t2         1
4     1    foo   prod_t3         4
5     2    bar   prod_t3         0
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0
这是熔化:

df.melt(id_vars=['p_id','p_name'],
        var_name='prod_time', 
        value_name='quantity')
输出:

   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     2    bar   prod_t1         0
2     1    foo   prod_t2         2
3     2    bar   prod_t2         1
4     1    foo   prod_t3         4
5     2    bar   prod_t3         0
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0
或者这可以是
堆栈

(df.set_index(['p_id','p_name'])
   .stack().reset_index()
   .rename(columns={'level_2':'prod_time', 0:'quantity'})
)
输出:

   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     2    bar   prod_t1         0
2     1    foo   prod_t2         2
3     2    bar   prod_t2         1
4     1    foo   prod_t3         4
5     2    bar   prod_t3         0
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0

我想做从宽到长的
,注意这里的顺序

df=pd.wide_to_long(df,['prod'],
                   i=['p_id','p_name'],
                   j='Number',
                   suffix='\w+',sep='_').reset_index()
   p_id p_name Number  prod
0     1    foo     t1     3
1     1    foo     t2     2
2     1    foo     t3     4
3     2    bar     t1     0
4     2    bar     t2     1
5     2    bar     t3     0

我想做从宽到长的
,注意这里的顺序

df=pd.wide_to_long(df,['prod'],
                   i=['p_id','p_name'],
                   j='Number',
                   suffix='\w+',sep='_').reset_index()
   p_id p_name Number  prod
0     1    foo     t1     3
1     1    foo     t2     2
2     1    foo     t3     4
3     2    bar     t1     0
4     2    bar     t2     1
5     2    bar     t3     0

这是一个使用
stack

(df.set_index(['p_id', 'p_name']).rename_axis('prod_time', axis=1)
                                 .stack().reset_index(name='quantity'))

Out[1103]:
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0

这是一个使用
stack

(df.set_index(['p_id', 'p_name']).rename_axis('prod_time', axis=1)
                                 .stack().reset_index(name='quantity'))

Out[1103]:
   p_id p_name prod_time  quantity
0     1    foo   prod_t1         3
1     1    foo   prod_t2         2
2     1    foo   prod_t3         4
3     2    bar   prod_t1         0
4     2    bar   prod_t2         1
5     2    bar   prod_t3         0