问题描述
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