gpt4 book ai didi

python - 转置 Pandas 数据框中一行的几个元素

转载 作者:行者123 更新时间:2023-12-01 01:14:36 25 4
gpt4 key购买 nike

我有以下类型的数据框-

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

如果检查列,没有列 Year (因为索引),并且列 MNDT 有尾随空格:

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并删除变量列:

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

关于python - 转置 Pandas 数据框中一行的几个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54474888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com