在Pandas数据框中的特定列上旋转

时间:2019-12-10 17:58:26

标签: pandas dataframe

我想对pandas数据框应用某种类型的数据透视,但是我找不到正确的方法。

我想做什么:

input_df

p_id p_name prod_t1 prod_t2 prod_t3
-----------------------------------
1    foo    3       2       4
2    bar    0       1       0

expected_output_df

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

4 个答案:

答案 0 :(得分:1)

df.melt(id_vars = ['p_name'], value_vars= ['prod_t1', 'prod_t2', 'prod_t3'])

>>>

    p_name  variable    value
0   foo     prod_t1     3
1   bar     prod_t1     0
2   foo     prod_t2     2
3   bar     prod_t2     1
4   foo     prod_t3     4
5   bar     prod_t3     0

答案 1 :(得分:1)

这很融化:

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

或者可以是stack

(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     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

答案 2 :(得分:1)

我想做wide_to_long,请注意这里的顺序

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

答案 3 :(得分:1)

仅此而已,这是使用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