我有宽格式的数据框 df,大约有 1000 列。我需要将其转换为长格式
示例表:
Date TLRA_Equity KAMN_Equity B_Equity ARNC_Equity RC_Equity DAR_Equity
1/1/2000 10 20 30 40 50 60
2/1/2000 15 25 35 45 55 65
3/1/2000 17 27 37 47 57 67
我可以通过数据帧融化将其转换为长格式,并使用以下代码插入到 python 中的表中
df = df.melt(id_vars = 'Date')
query = "insert into table values (?,?,?)"
cursor.executemany(query, df.values.tolist())
长格式数据:
investment variable value
1/1/2000 TLRA_Equity 10
1/1/2000 KAMN_Equity 20
1/1/2000 B_Equity 30
1/1/2000 ARNC_Equity 40
但是转换长格式后,更新表需要很长时间。有没有办法以宽格式插入数据库表并在sql中隐藏长格式以加快该过程。
运行“John Cappelletti”解决方案的输出
Date Item Value
1/1/2000 Date 1/1/2000
1/1/2000 TLRA_x0020_Equity 10
1/1/2000 KAMN_x0020_Equity 20
1/1/2000 B_x0020_Equity 30
1/1/2000 ARNC_x0020_Equity 40
最佳答案
显然 Unpivot 的性能会更高,但这里有一种方法可以“动态”取消数据透视,而无需使用动态 SQL。
优点是您不必指定 1000 列。
示例
Select A.Date
,C.*
From YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From XMLData.nodes('//@*') xNode(xAttr)
Where xAttr.value('local-name(.)','varchar(100)') not in ('Date')
) C
返回
编辑
...
,Item = replace(xAttr.value('local-name(.)', 'varchar(100)'),'_x0020_',' ')
...
关于python - 在sql server和dataframe中将宽格式转换为长格式大约有1000列 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424546/