python - 在 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
实在想不通,怎么办?
解决方案
数据:
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')
然后使用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
编辑:
所以有 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
推荐阅读
- git - 升级到 MacOS Mohave 10.14.4 (18E226) 后无法 npm 安装或使用 git
- javascript - 引导日期时间选择器动态默认日期不起作用
- java - 更改缓存后如何返回当前数据列表?
- java - 如何从另一个文件夹执行jar文件
- c# - 如何使用实体框架将两个实体映射到一个数据库表(代码优先到现有数据库)?
- php - 类似功能不适用于搜索
- javascript - 两个标签之间的网页抓取,使用cheerio
- java - 如何使用嵌套数组列表将 JLabel 项目发送到 Apache POI
- python - 如何正确创建 saved_model.pb?
- node.js - 在 mongodb 中加入两个集合