我有一个带有9个时间序列变量的pandas
数据帧:AS
,CR6
,TCPR
,...。尽管如此,我需要对数据帧中的值进行插值数据框的最终形式需要保留在透视形式中,以便进行后续分析。棘手的是,数据框被旋转到列名称中年份所在的位置。
AS_2014 AS_2015 AS_2016 AS_2017 AS_2018 AS_2019 CR6_2014 CR6_2015 CR6_2016 CR6_2017 ... TCPR123_2016 TCPR123_2017 TCPR123_2018 TCPR123_2019 TDS_2014 TDS_2015 TDS_2016 TDS_2017 TDS_2018 TDS_2019
s_wellid
0103041-001 NaN 2.3 NaN NaN NaN 0.0 0.0 NaN NaN NaN ... NaN NaN NaN 0.000 NaN 350.0 NaN NaN NaN 350.0
0105020-001 0.0 NaN 0.0 NaN NaN NaN NaN NaN 1.9 NaN ... NaN NaN 0.001 0.000 NaN NaN NaN NaN NaN NaN
0110001-008 2.0 2.0 2.0 2.0 2.0 NaN 1.0 1.0 1.0 1.0 ... NaN NaN 0.005 0.005 490.0 520.0 530.0 490.0 460.0 NaN
0110001-009 2.0 2.0 2.0 2.0 2.0 NaN 1.0 1.0 1.0 1.0 ... NaN NaN 0.005 NaN 570.0 550.0 540.0 550.0 560.0 NaN
0110001-010 2.0 2.0 2.0 2.0 2.0 NaN 1.0 1.0 1.0 1.0 ... NaN NaN 0.005
我基本上需要按AS_*
或CR6_*
之类的前缀对所有列进行分组,然后在年份之间进行插值。
我尝试使用melt()
命令取消数据透视,但是在尝试重新透视最终结果时会产生各种问题。有人知道如何开始处理此类问题。
答案 0 :(得分:2)
首先将str.split
按列用于MultiIndex
,因此可以通过DataFrame.stack
进行第一级整形,然后使用DataFrame.droplevel
:
df.columns = df.columns.str.split('_', expand=True)
df1 = df.stack(0).interpolate(axis=1)
print (df1)
2014 2015 2016 2017 2018 2019
s_wellid
0103041-001 AS NaN 2.3 1.725 1.15 0.575 0.000
CR6 0.0 0.0 0.000 0.00 0.000 0.000
TCPR123 NaN NaN NaN NaN NaN 0.000
TDS NaN 350.0 350.000 350.00 350.000 350.000
0105020-001 AS 0.0 0.0 0.000 0.00 0.000 0.000
CR6 NaN NaN 1.900 1.90 1.900 1.900
TCPR123 NaN NaN NaN NaN 0.001 0.000
0110001-008 AS 2.0 2.0 2.000 2.00 2.000 2.000
CR6 1.0 1.0 1.000 1.00 1.000 1.000
TCPR123 NaN NaN NaN NaN 0.005 0.005
TDS 490.0 520.0 530.000 490.00 460.000 460.000
0110001-009 AS 2.0 2.0 2.000 2.00 2.000 2.000
CR6 1.0 1.0 1.000 1.00 1.000 1.000
TCPR123 NaN NaN NaN NaN 0.005 0.005
TDS 570.0 550.0 540.000 550.00 560.000 560.000
0110001-010 AS 2.0 2.0 2.000 2.00 2.000 2.000
CR6 1.0 1.0 1.000 1.00 1.000 1.000
TCPR123 NaN NaN NaN NaN 0.005 0.005
最后一次用DataFrame.unstack
重塑形状,并将MultiIndex
转换为包含map
和join
的列:
df3 = df1.unstack(1)
df3.columns = df3.columns.map('_'.join)
print (df3)
2014_AS 2014_CR6 2014_TCPR123 2014_TDS 2015_AS 2015_CR6 \
s_wellid
0103041-001 NaN 0.0 NaN NaN 2.3 0.0
0105020-001 0.0 NaN NaN NaN 0.0 NaN
0110001-008 2.0 1.0 NaN 490.0 2.0 1.0
0110001-009 2.0 1.0 NaN 570.0 2.0 1.0
0110001-010 2.0 1.0 NaN NaN 2.0 1.0
2015_TCPR123 2015_TDS 2016_AS 2016_CR6 ... 2017_TCPR123 \
s_wellid ...
0103041-001 NaN 350.0 1.725 0.0 ... NaN
0105020-001 NaN NaN 0.000 1.9 ... NaN
0110001-008 NaN 520.0 2.000 1.0 ... NaN
0110001-009 NaN 550.0 2.000 1.0 ... NaN
0110001-010 NaN NaN 2.000 1.0 ... NaN
2017_TDS 2018_AS 2018_CR6 2018_TCPR123 2018_TDS 2019_AS \
s_wellid
0103041-001 350.0 0.575 0.0 NaN 350.0 0.0
0105020-001 NaN 0.000 1.9 0.001 NaN 0.0
0110001-008 490.0 2.000 1.0 0.005 460.0 2.0
0110001-009 550.0 2.000 1.0 0.005 560.0 2.0
0110001-010 NaN 2.000 1.0 0.005 NaN 2.0
2019_CR6 2019_TCPR123 2019_TDS
s_wellid
0103041-001 0.0 0.000 350.0
0105020-001 1.9 0.000 NaN
0110001-008 1.0 0.005 460.0
0110001-009 1.0 0.005 560.0
0110001-010 1.0 0.005 NaN
[5 rows x 24 columns]