这似乎是一个基本的枢轴操作。我想在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
执行上述任务时有一个堆栈选项。但不知道如何使用它。
答案 0 :(得分:1)
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
的另一种解决方案
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