Python pandas pivot / stack操作

时间:2017-01-05 13:18:19

标签: python pandas

这似乎是一个基本的枢轴操作。我想在python pandas中做到这一点。我的数据集看起来像:

Date        weekno no_visitors_store1   no_visitors_store2 no_visitors_store3

2015/01/01    1            45                 34                  46
2015/01/02    1            40                 32                  100
2015/01/03    1            45                 30                  46
2015/01/04    1            45                 11                  10

我想以这样的方式进行转换,以便我只想转置最后三列,这样我就可以将列存储为列和它们的核心数字。

Date          weekno    store  no_of_vistors     
2015/01/01    1         store1  45
2015/01/01    1         store2  34
2015/01/01    1         store3  46
2015/01/02    1         store1  40  
2015/01/02    1         store2  32  
2015/01/02    1         store3  100   

执行上述任务时有一个堆栈选项。但不知道如何使用它。

1 个答案:

答案 0 :(得分:1)

您可以replace第一列名称,然后使用melt

df.columns = df.columns.str.replace('no_visitors_','')
print(pd.melt(df, id_vars=['Date','weekno'], value_name='no_of_vistors', var_name='store'))
          Date  weekno   store  no_of_vistors
0   2015/01/01       1  store1             45
1   2015/01/02       1  store1             40
2   2015/01/03       1  store1             45
3   2015/01/04       1  store1             45
4   2015/01/01       1  store2             34
5   2015/01/02       1  store2             32
6   2015/01/03       1  store2             30
7   2015/01/04       1  store2             11
8   2015/01/01       1  store3             46
9   2015/01/02       1  store3            100
10  2015/01/03       1  store3             46
11  2015/01/04       1  store3             10

set_indexstackreset_index

的另一种解决方案
print(df.set_index(['Date','weekno'])
        .stack().reset_index(name='no_of_vistors')
        .rename(columns={'level_2':'store'}))

          Date  weekno   store  no_of_vistors
0   2015/01/01       1  store1             45
1   2015/01/01       1  store2             34
2   2015/01/01       1  store3             46
3   2015/01/02       1  store1             40
4   2015/01/02       1  store2             32
5   2015/01/02       1  store3            100
6   2015/01/03       1  store1             45
7   2015/01/03       1  store2             30
8   2015/01/03       1  store3             46
9   2015/01/04       1  store1             45
10  2015/01/04       1  store2             11
11  2015/01/04       1  store3             10

lreshape的解决方案,但缺少列store

cols = [col for col in df.columns if 'no_visitors' in col]
print(pd.lreshape(df, {'no_of_vistors':cols}))
          Date  weekno  no_of_vistors
0   2015/01/01       1             45
1   2015/01/02       1             40
2   2015/01/03       1             45
3   2015/01/04       1             45
4   2015/01/01       1             34
5   2015/01/02       1             32
6   2015/01/03       1             30
7   2015/01/04       1             11
8   2015/01/01       1             46
9   2015/01/02       1            100
10  2015/01/03       1             46
11  2015/01/04       1             10