首页 > 解决方案 > 在 Pandas 数据框中转置一行的几个元素

问题描述

我有以下类型的数据框-

Year MN DT HR01 HR02 HR03 HR04 PRMEAN PRSMAX PRSMIN
2011 1  1    34   35   67   78     12    235    256
2011 1  2    12   56   78   56     23    256    267
2011 2  1    12   2    32   12     74    221    435

其中 MN:Months, DT:Date,HR:Hour 。在这里我希望 HR 数据按以下方式按列与其日期对齐。

Year MN DT HR PRMEAN PRSMAX PRSMIN
2011 1  1  34     12    235    256
2011 1  1  35     12    235    256
2011 1  1  67     12    235    256
2011 1  1  78     12    235    256
2011 1  2  12     23    256    267
2011 1  2  56     23    256    267
2011 1  2  78     23    256    267
2011 1  2  56     23    256    267
2011 2  1  12     74    221    435
2011 2  1  2     74     221     435
2011 2  1  32     74    221    435
2011 2  1  12     74    221    435

实在想不通,怎么办?

标签: pythonpandas

解决方案


数据:

print (df)
      MN   DT   HR01  HR02  HR03  HR04  PRMEAN  PRSMAX  PRSMIN
2011    1    1    34    35    67    78      12     235     256
2011    1    2    12    56    78    56      23     256     267
2011    2    1    12     2    32    12      74     221     435

如果检查列 thre 没有列Year(因为索引)和列MN并且DT有 traling 空格:

print (df.columns)
Index(['MN ', 'DT ', 'HR01', 'HR02', 'HR03', 'HR04', 'PRMEAN', 'PRSMAX',
       'PRSMIN'],
      dtype='object')

解决方案是删除它们str.strip,将索引转换为列并重命名:

df.columns = df.columns.str.strip()
df = df.reset_index().rename(columns={'index':'Year'})

print (df)
   Year  MN  DT  HR01  HR02  HR03  HR04  PRMEAN  PRSMAX  PRSMIN
0  2011   1   1    34    35    67    78      12     235     256
1  2011   1   2    12    56    78    56      23     256     267
2  2011   2   1    12     2    32    12      74     221     435

print (df.columns)
Index(['Year', 'MN', 'DT', 'HR01', 'HR02', 'HR03', 'HR04', 'PRMEAN', 'PRSMAX',
       'PRSMIN'],
      dtype='object')

然后使用meltsort_values删除variable列:

df1 = (df.melt(id_vars=['Year','MN','DT','PRMEAN','PRSMAX','PRSMIN'],value_name='HR')
         .sort_values('variable')
         .drop('variable', axis=1))

列的最后更改顺序:

df1 = df1[['Year','MN','DT','HR','PRMEAN','PRSMAX','PRSMIN']]
print (df1)
    Year  MN  DT  HR  PRMEAN  PRSMAX  PRSMIN
0   2011   1   1  34      12     235     256
3   2011   1   1  35      12     235     256
6   2011   1   1  67      12     235     256
9   2011   1   1  78      12     235     256
1   2011   1   2  12      23     256     267
4   2011   1   2  56      23     256     267
7   2011   1   2  78      23     256     267
10  2011   1   2  56      23     256     267
2   2011   2   1  12      74     221     435
5   2011   2   1   2      74     221     435
8   2011   2   1  32      74     221     435
11  2011   2   1  12      74     221     435

编辑:

所以有 column YEAR,所以需要:

df = pd.read_csv('Pres.csv')

df.columns = df.columns.str.strip()

df1 = (df.melt(id_vars=['YEAR','MN','DT','PRMEAN','PRSMAX','PRSMIN'],
               value_name='HR',
               var_name='HOUR')
         .assign(HOUR = lambda x: x.HOUR.str.extract('(\d+)'))
         .sort_values(['YEAR','MN','DT','HOUR'])
         )

print (df1.head(30))
       YEAR  MN  DT PRMEAN PRSMAX PRSMIN HOUR     HR
0      2001   1   1  949.5  951.8  947.8   01  949.3
3227   2001   1   1  949.5  951.8  947.8   02  949.1
6454   2001   1   1  949.5  951.8  947.8   03  948.5
9681   2001   1   1  949.5  951.8  947.8   04  948.5
12908  2001   1   1  949.5  951.8  947.8   05  948.3
16135  2001   1   1  949.5  951.8  947.8   06  948.6
19362  2001   1   1  949.5  951.8  947.8   07  949.5
22589  2001   1   1  949.5  951.8  947.8   08  950.3
25816  2001   1   1  949.5  951.8  947.8   09  951.6
29043  2001   1   1  949.5  951.8  947.8   10  951.8
32270  2001   1   1  949.5  951.8  947.8   11  951.8
35497  2001   1   1  949.5  951.8  947.8   12  950.8
38724  2001   1   1  949.5  951.8  947.8   13  949.7
41951  2001   1   1  949.5  951.8  947.8   14  948.8
45178  2001   1   1  949.5  951.8  947.8   15  947.8
48405  2001   1   1  949.5  951.8  947.8   16  947.8
51632  2001   1   1  949.5  951.8  947.8   17  947.8
54859  2001   1   1  949.5  951.8  947.8   18  947.8
58086  2001   1   1  949.5  951.8  947.8   19  948.8
61313  2001   1   1  949.5  951.8  947.8   20  949.7
64540  2001   1   1  949.5  951.8  947.8   21  949.9
67767  2001   1   1  949.5  951.8  947.8   22  950.7
70994  2001   1   1  949.5  951.8  947.8   23  950.6
74221  2001   1   1  949.5  951.8  947.8   24    950
1      2001   1   2  951.2  953.4  948.8   01  949.8
3228   2001   1   2  951.2  953.4  948.8   02  949.5
6455   2001   1   2  951.2  953.4  948.8   03    949
9682   2001   1   2  951.2  953.4  948.8   04  948.8
12909  2001   1   2  951.2  953.4  948.8   05  948.9
16136  2001   1   2  951.2  953.4  948.8   06  949.7

推荐阅读