SQL Server Spark/Python数据框架-将行转置为列

k97glaaz  于 2022-11-21  发布在  Spark
关注(0)|答案(1)|浏览(125)

我有一个样本数据如下所示
| 生产日期|成本中心密钥|AEMainCategory关键字|AE损失幅度|
| - -|- -|- -|- -|
| 2022年1月1日|小行星100030| OAE|小行星84.94871412|
| 2022年1月1日|小行星100030|夸大| -0.010897228 |
| 2022年1月1日|小行星100030| UL认证|15.06218311一个|
| 2022年1月1日|小行星100040| OAE| 49.99603575美元|
| 2022年1月1日|小行星100040| UL认证|50.00001425美元|
| 2022年1月1日|小行星100040|未申报|0.003950003单位|
| 2022年1月2日|小行星100030| OAE|小行星71.58823183|
| 2022年1月2日|小行星100030| UL认证|28.36946736美元|
| 2022年1月2日|小行星100030|未申报|0.042300804单位|
| 2022年1月2日|小行星100040| OAE| 49.99702425美元|
| 2022年1月2日|小行星100040| UL认证|50.00002575美元|
| 2022年1月2日|小行星100040|未申报|0.002950002单位|
我需要转置AeMaincategoryKey列,并需要以下形式的输出:

生产日期成本中心关键字的组合应该有1行

| 生产日期|成本中心密钥|OAE|夸大|UL认证|未申报|
| - -|- -|- -|- -|- -|- -|
| 2022年1月1日|小行星100030|小行星84.94871412| -0.010897228 |15.0621831美元|第0页|
| 2022年1月1日|小行星100040| 49.99603575美元|第0页|50.0000143美元|0.00395单位|
| 2022年1月2日|小行星100030|小行星71.58823183|第0页|28.3694674美元|0.0423008单位|
| 2022年1月2日|小行星100040| 49.99702425美元|第0页|50.0000258美元|0.00295单位|
我正在写下面的代码,但它没有产生所需的输出。

from pyspark.sql import SparkSessionimport pandas as pd

##creating a Spark 
Dataframespark_df = sqlContext.sql("select * from hive_metastore.asseteffectiveness.asset_effectiveness_maincat where productiondate  in ('2022-01-01','2022-01-02') and costcenterkey in (100030,100040)")
##Converting to Spark Dataframepandas_df = spark_df.toPandas()
pandas_df.pivot_table(index=['ProductionDate','CostCenterKey'], columns=['AEMainCategoryKey'], values='AELossMagnitude',   fill_value=0)
display(pandas_df)
eulz3vhy

eulz3vhy1#

从原始格式

ProductionDate CostCenterKey AEMainCategoryKey  AELossMagnitude
0          1/1/22        100030               OAE        84.948714
1          1/1/22        100030      Overdeclared        -0.010897
2          1/1/22        100030                UL        15.062183
3          1/1/22        100040               OAE        49.996036
4          1/1/22        100040                UL        50.000014
5          1/1/22        100040        Undeclared         0.003950
6          1/2/22        100030               OAE        71.588232
7          1/2/22        100030                UL        28.369467
8          1/2/22        100030        Undeclared         0.042301
9          1/2/22        100040               OAE        49.997024
10         1/2/22        100040                UL        50.000026
11         1/2/22        100040        Undeclared         0.002950

我在代码中重新创建了它:

df = pd.DataFrame({'ProductionDate': ['1/1/22', '1/1/22', '1/1/22', '1/1/22',
                                      '1/1/22', '1/1/22', '1/2/22', '1/2/22',
                                      '1/2/22', '1/2/22', '1/2/22', '1/2/22'],
                   'CostCenterKey': ['100030', '100030', '100030',
                                     '100040', '100040', '100040',
                                     '100030', '100030', '100030',
                                     '100040', '100040', '100040'],
                   'AEMainCategoryKey': ['OAE', 'Overdeclared', 'UL',
                                         'OAE', 'UL', 'Undeclared',
                                         'OAE', 'UL', 'Undeclared',
                                         'OAE', 'UL', 'Undeclared',],
                   'AELossMagnitude': [84.94871412, -0.010897228, 15.06218311,
                                       49.99603575, 50.00001425, 0.003950003,
                                       71.58823183, 28.36946736, 0.042300804,
                                       49.99702425, 50.00002575, 0.002950002]})

我有两个版本。
第1版

df3 = df.groupby(['CostCenterKey', 'ProductionDate']).first().unstack(
    'ProductionDate').reset_index().dropna(axis='columns')
print(df3)

版本1的结果

CostCenterKey AEMainCategoryKey  ... AELossMagnitude           
ProductionDate                          1/1/22  ...          1/1/22     1/2/22
0                     100030               OAE  ...       84.948714  71.588232
1                     100040               OAE  ...       49.996036  49.997024

第二版

df2 = df.pivot(index=['CostCenterKey', 'ProductionDate'],
               columns=['AEMainCategoryKey'], values=[
        'AELossMagnitude']).reset_index().dropna(axis='columns')
print(df2)

版本2的结果

CostCenterKey ProductionDate AELossMagnitude           
AEMainCategoryKey                                          OAE         UL
0                        100030         1/1/22       84.948714  15.062183
1                        100030         1/2/22       71.588232  28.369467
2                        100040         1/1/22       49.996036  50.000014
3                        100040         1/2/22       49.997024  50.000026

相关问题