python - 在sql server和dataframe中将宽格式转换为长格式大约有1000列 - 优化

标签 python sql sql-server

我有宽格式的数据框 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

返回

enter image description here

编辑

 ...
,Item  = replace(xAttr.value('local-name(.)', 'varchar(100)'),'_x0020_',' ')
 ...

关于python - 在sql server和dataframe中将宽格式转换为长格式大约有1000列 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424546/

相关文章:

python - 如何在 python 中读取 config(.ini) 文件,它将在 2.7 和 3.x python 上运行

sql - 语法错误 : missing expression (ORA-00936)

php - 将一列中的页面分组

sql 仅在表存在的情况下从第一个数据库更新第二个数据库中的数据

python - 如何在 Google App Engine 柔性环境中运行 TensorFlow?

python - 根据 Pandas 中的列名和位置选择列

php - 如何从表格中的每个不同类别中选择三行?

sql-server - 简单的 CHECK 约束没那么简单

sql - 可以使用 SQL Server 模拟 ON DUPLICATE KEY UPDATE 的 mySQL 功能

python - 将 pandas DataFrame 保存到带有日期类型的 Parquet 的最佳方法