我具有以下类型的数据框-
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
我真的不知道该怎么办?
答案 0 :(得分:2)
数据:
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
都具有空白:
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')
然后将melt
与sort_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
编辑:
所以有列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