使用pandas基于行值将列转换为行

时间:2016-12-13 23:52:48

标签: python pandas

我有一个excel文件如下:

ID      wk48     wk49    wk50    wk51   wk52   wk1   wk2 
1123     10        22      233     2     4     22     11
1198      9         4       44    23    34     5     234
101       3         6        3    43    33     34     78

我想在python中输出如下

1123 wk48  10
1123 wk49  22
1123 wk50  233
1123 wk51  2
1123 wk52  4
1123 wk1   22
1123 wk2   11
1198 wk48  9
1198 wk49  4
1198 wk50  44
1198 wk51  23
1198 wk52  34
1198 wk1   5
1198 wk2   234

任何建议

2 个答案:

答案 0 :(得分:2)

我要做的第一件事是将ID设置为您的索引:

df.set_index('ID',inplace=True)

接下来,您可以使用以下命令重新定位数据框:

df = df.stack().reset_index()
print df
-------------------------------------------
Output:
      ID level_1    0
0   1123    wk48   10
1   1123    wk49   22
2   1123    wk50  233
3   1123    wk51    2
4   1123    wk52    4
5   1123     wk1   22
6   1123     wk2   11
7   1198    wk48    9
8   1198    wk49    4
9   1198    wk50   44
10  1198    wk51   23
11  1198    wk52   34
12  1198     wk1    5
13  1198     wk2  234
14   101    wk48    3
15   101    wk49    6
16   101    wk50    3
17   101    wk51   43
18   101    wk52   33
19   101     wk1   34
20   101     wk2   78

答案 1 :(得分:1)

阅读pandas中的数据:

In[1]:
import pandas as pd
df = pd.read_excel('yourfile.xlsx', index_col=0)

然后使用DataFrame.stack将列移动到索引:

In [2]: s = df.stack()
        # Rename the index names for cleaner output
        s.index.names = ['ID','Week']

你会得到一个像你想要的pd.Series:

In [3]: s.head(10)
Out[3]: 
ID    Week    
1123  wk48     10
      wk49     22
      wk50    233
      wk51      2
      wk52      4
      wk1      22
      wk2      11
1198  wk48      9
      wk49      4
      wk50     44
dtype: int64

如果您希望将其作为数据框返回:

In [4]: s.name = 'Value'
        df = s.to_frame()

然后,您可以将其导出回Excel,例如:

In [5]: df.to_excel('newfile.xslx')

或者,如果您不希望在Excel中对ID进行分组(合并单元格),则可以执行以下操作:

In [6]: df.reset_index().to_excel('newfile.xlsx', index=False)