Python 将列标题转换为

Python 将列标题转换为,python,pandas,Python,Pandas,我不确定我的问题是否有一个特定的名称(我记得听过一次讲座,老师说一部分知识是知道事物的名称) 无论如何,我正在使用一些遗留系统,我的数据输出如下: 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

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

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

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转置,但将索引保留为商店。 将每个实例转化为观察,仅以前2家店铺为例:

    Shop    Week Hour
0   1       1    15
1   1       2    5
2   2       1    25
3   2       2    44

实现这一目标的最具Python风格的方式是什么?在一个相对中等大小的df(500行52周)

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

# 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
您可以重命名列,然后:


使用从宽到长的

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'})

假设我的DF中有52个,你会每周去重新命名吗?我不明白为什么不,这应该是一个快速的操作。最有效的是,我的商店的数据类型是int,所以拆分抛出了一个错误,jpp的代码对我来说完美无瑕。在上面的例子中,更改数据类型会对上面的代码起作用吗?我不确定
Shop
的数据类型会如何影响上面的代码(在我的解释器中也是int)。但是如果是关于列重命名,那么您可以使用类似jpp的方法,只重命名以
Week
开头的列。我很可能没有正确使用代码,它在我的示例DF中工作得非常好。谢谢你的回答。太好了!检查数据:)比如sacul的my shop是一个int,所以我class='shop'抛出了一个错误in'需要字符串作为左操作数,而不是int@Datanovice我正在使用您的示例生成这个什么是错误?您的代码是完美的,我正在使用sql数据转储。谢谢你的帮助,好先生。
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'})