为了账号安全,请及时绑定邮箱和手机立即绑定

将列标题转换为观察熊猫

将列标题转换为观察熊猫

扬帆大鱼 2021-06-30 13:30:17
我不确定我的问题是否有特定的名称(我记得听过一个讲座,老师说一部分知识是知道事物的名称)。无论如何,我正在使用一些遗留系统,我的数据输出如下:df = pd.DataFrame({'Shop' : [1,2,3,4,5,6,7,8,9,10],'Week 1' : [15,25,11,22,0,-1,15,11,76,62],'Week 2' : [5,44,55,21,12,51,-10,25,81,46]})print(df) Shop   Week 1  Week 20   1   15      51   2   25      442   3   11      553   4   22      214   5   0       125   6   -1      516   7   15     -107   8   11      258   9   76      819   10  62      46在这种情况下,周数应该是一个观察值,而这个数字是一个应该分配给它的值。我正在尝试做的是以下内容。转置DF,但将索引保留为Shop。将每个实例变成一个观察值,因此仅以前 2 个商店为例:    Shop    Week Hour0   1       1    151   1       2    52   2       1    253   2       2    44实现这一目标的最pythonic方法是什么?在相对中等大小的 df(500 行 52 周)上
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您可以重命名列,pd.melt然后sort_values

df.columns = [i if not i.startswith('Week') else int(i[-1]) for i in df]


res = pd.melt(df, id_vars='Shop', var_name='Week', value_name='Hour')\

        .sort_values('Shop').reset_index(drop=True)


print(res)


    Shop Week  Hour

0      1    1    15

1      1    2     5

2      2    1    25

3      2    2    44

...

16     9    2    81

17     9    1    76

18    10    1    62

19    10    2    46


查看完整回答
反对 回复 2021-07-06
?
湖上湖

TA贡献2003条经验 获得超2个赞

使用 wide_to_long


pd.wide_to_long(df,'Week ',i='Shop',j='week')

Out[770]: 

           Week 

Shop week       

1    1        15

2    1        25

3    1        11

4    1        22

5    1         0

6    1        -1

7    1        15

8    1        11

9    1        76

10   1        62

1    2         5

2    2        44

3    2        55

4    2        21

5    2        12

6    2        51

7    2       -10

8    2        25

9    2        81

10   2        46


#pd.wide_to_long(df,'Week ',i='Shop',j='week').sort_index(level=0).reset_index().rename(columns={'Week ':'Hour'})



查看完整回答
反对 回复 2021-07-06
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我会使用这样的东西,尽管所有的重命名有点混乱:


# Rename columns with dict comprehension so it can extend to more than week 1 and week 2

df2 = (df.rename(columns={i: int(i.split()[-1]) for i in df.columns[1:]})

       .set_index('Shop')

       .stack()

       .reset_index()

       .rename(columns={'level_1':'Week', 0:'Hour'}))


>>> df2


    Shop  Week  Hour

0      1     1    15

1      1     2     5

2      2     1    25

3      2     2    44

4      3     1    11

5      3     2    55

6      4     1    22

7      4     2    21

8      5     1     0

9      5     2    12

10     6     1    -1

11     6     2    51

12     7     1    15

13     7     2   -10

14     8     1    11

15     8     2    25

16     9     1    76

17     9     2    81

18    10     1    62

19    10     2    46


查看完整回答
反对 回复 2021-07-06
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号