将列标题转换为观察熊猫

我不确定我的问题是否有特定的名称(我记得听过一个讲座,老师说一部分知识是知道事物的名称)。


无论如何,我正在使用一些遗留系统,我的数据输出如下:


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 2

0   1   15      5

1   2   25      44

2   3   11      55

3   4   22      21

4   5   0       12

5   6   -1      51

6   7   15     -10

7   8   11      25

8   9   76      81

9   10  62      46

在这种情况下,周数应该是一个观察值,而这个数字是一个应该分配给它的值。


我正在尝试做的是以下内容。


转置DF,但将索引保留为Shop。将每个实例变成一个观察值,因此仅以前 2 个商店为例:


    Shop    Week Hour

0   1       1    15

1   1       2    5

2   2       1    25

3   2       2    44

实现这一目标的最pythonic方法是什么?在相对中等大小的 df(500 行 52 周)上


扬帆大鱼
浏览 140回答 3
3回答

尚方宝剑之说

您可以重命名列,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  Hour0      1    1    151      1    2     52      2    1    253      2    2    44...16     9    2    8117     9    1    7618    10    1    6219    10    2    46

湖上湖

使用 wide_to_longpd.wide_to_long(df,'Week ',i='Shop',j='week')Out[770]:            Week Shop week       1    1        152    1        253    1        114    1        225    1         06    1        -17    1        158    1        119    1        7610   1        621    2         52    2        443    2        554    2        215    2        126    2        517    2       -108    2        259    2        8110   2        46#pd.wide_to_long(df,'Week ',i='Shop',j='week').sort_index(level=0).reset_index().rename(columns={'Week ':'Hour'})

慕运维8079593

我会使用这样的东西,尽管所有的重命名有点混乱:# Rename columns with dict comprehension so it can extend to more than week 1 and week 2df2 = (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  Hour0      1     1    151      1     2     52      2     1    253      2     2    444      3     1    115      3     2    556      4     1    227      4     2    218      5     1     09      5     2    1210     6     1    -111     6     2    5112     7     1    1513     7     2   -1014     8     1    1115     8     2    2516     9     1    7617     9     2    8118    10     1    6219    10     2    46
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python