将宽数据集转换为具有多列的长格式

问题描述

我有一个类似于以下内容的数据集:

Name   County    Industry   Jobs.2019  Jobs.2018  Establish.2019  Establish.2018  EPW.2019  EPW.2018
rows_0 A@R_502_6421@s,OH Auto        1         2          3               4               5         6
row_1  Allen,OH Mfg         2         3          5               7               9         10
...
row_100 A@R_502_6421@s,OH IT          5         32         1               87              8         9

最终,我想以长格式进行转换,例如:

Name   County    Industry  Jobs Establish EPW Year
rows_0 A@R_502_6421@s,OH Auto        1    3         5   2019
rows_1 A@R_502_6421@s,OH Auto        2    4         6   2018
rows_2 Allen,OH Mfg         1    5         9   2019

我能够将其融化成长格式:

data_df_unpivot = data_df.melt(id_vars=['County','Industry'],var_name=['metric'],value_name='value')

但这真的只能让我得到以下格式:

County    Industry metric    value
A@R_502_6421@s,OH  Auto    Jobs.2019 1
A@R_502_6421@s,OH  Auto    Jobs.2018 2
A@R_502_6421@s,OH  Auto    EPW.2019  5
A@R_502_6421@s,OH  Auto    EPW.2018  6

我知道我需要对Jobs.2019等进行拆分,但是不确定在将事实转换为适当格式后该怎么做。

所有数据都来自API,并且是我必须扁平化的嵌套JSON。最终目标是加载到sql中,所以我想知道我是用Python进行ETL还是让SNowflake处理,我都面临着与延长表相同的问题。

随着数据的出现(即Jobs.2020,Jobs.2021),这也将成为一个活着的桌子

解决方法

答案就在您的标题中:使用pd.wide_to_long

print (pd.wide_to_long(df,stubnames=["Jobs","Establish","EPW"],i=["Name","County","Industry"],j="Year",sep=".",suffix="\d+")
       .reset_index())

      Name     County Industry  Year  Jobs  Establish  EPW
0    row_0  Adams,OH     Auto  2019     1          3    5
1    row_0  Adams,OH     Auto  2018     2          4    6
2    row_1  Allen,OH      Mfg  2019     2          5    9
3    row_1  Allen,OH      Mfg  2018     3          7   10
4  row_100  Adams,OH       IT  2019     5          1    8
5  row_100  Adams,OH       IT  2018    32         87    9