将pandas枢轴转换为sql枢轴(代码帮助)

时间:2018-10-06 12:17:54

标签: sql pandas

这对于sql专家可能是一个非常简单的问题。但是我如何将熊猫枢轴转换为sql枢轴。 (请注意-我有一个很大的数据,存储在sql中),当我尝试将其导入Jupyter Notebook中以转换为pandas数据框时,它只是没有(Jupyter内核死亡)。

现在我需要帮助来进行SQL转换

这是我的熊猫虚拟数据和解决方案

将numpy导入为np 将熊猫作为pd导入

创建虚假数据

newd = {'year': [2001, 2002, 2005, 2002, 2004, 1999, 1999, 1999, 2012, 2000, 2010, 2005, 2006, 2009, 2009, 
                 2009, 2009, 2010, 2007, 2008, 2009, 2010],
     'tin': [12, 23, 24, 28,30, 12,7, 12, 12, 23, 24, 7, 12, 35, 39,37, 36, 333, 13, 13, 13, 13],
     'ptin': [12, 23, 28, 22, 12, 12,0, 12, 12, 23, 27, 45, 99, 7, 7, 7, 7, 0, 17, 21, 26, 18] }

转换为熊猫df

newdf=pd.DataFrame(newd)

通过付款人的锡对锡进行分组

df=newdf.groupby(['tin', 'year'])['ptin'].groups
print(list(df))
print(np.unique(newdf['year'].values))

按年份观察数据透视表中的分布情况

print(newdf.pivot_table(index='tin', columns='year', values='ptin', aggfunc=len, fill_value=0))
#newdf[newdf['year']==1999]

year  1999  2000  2001  2002  2004  2005  2006  2007  2008  2009  2010  2012
tin                                                                         
7        1     0     0     0     0     1     0     0     0     0     0     0
12       2     0     1     0     0     0     1     0     0     0     0     1
13       0     0     0     0     0     0     0     1     1     1     1     0
23       0     1     0     1     0     0     0     0     0     0     0     0
24       0     0     0     0     0     1     0     0     0     0     1     0
28       0     0     0     1     0     0     0     0     0     0     0     0
30       0     0     0     0     1     0     0     0     0     0     0     0
35       0     0     0     0     0     0     0     0     0     1     0     0
36       0     0     0     0     0     0     0     0     0     1     0     0
37       0     0     0     0     0     0     0     0     0     1     0     0
39       0     0     0     0     0     0     0     0     0     1     0     0
333      0     0     0     0     0     0     0     0     0     0     1     0

1 个答案:

答案 0 :(得分:0)

以下是在SQL中创建伪数据集的方法。 (注:数据是在SQL中按行而不是按列插入的。)

IF OBJECT_ID('fake_data','U') IS NOT NULL 
    DROP TABLE fake_data;
CREATE TABLE fake_data (
    [year] int
    ,[tin] int
    ,[ptin] int
);
INSERT INTO fake_data (
    [year]
    ,[tin]
    ,[ptin]
)
VALUES
    (2001,12,12),(2002,23,23),(2005,24,28),(2002,28,22),(2004,30,12),(1999,12,12)
    ,(1999,7,0),(1999,12,12),(2012,12,12),(2000,23,23),(2010,24,27),(2005,7,45)
    ,(2006,12,99),(2009,35,7),(2009,39,7),(2009,37,7),(2009,36,7),(2010,333,0)
    ,(2007,13,17),(2008,13,21),(2009,13,26),(2010,13,18);

然后查看样本数据集:

SELECT * FROM fake_data;

这是您的数据透视表的SQL查询。 N.B.列名不一定总是用括号括起来,但是如果您的列名是SQL中的保留字(例如'year',一个函数),则是个好主意。

SELECT
    [tin],[1999],[2000],[2001],[2002],[2004],[2005],[2006],[2007],[2008],[2009],[2010],[2012]
FROM 
    fake_data
PIVOT (
    COUNT([ptin])
    FOR [year]
    IN ([1999],[2000],[2001],[2002],[2004],[2005],[2006],[2007],[2008],[2009],[2010],[2012])
) AS myPivotTable
ORDER BY [tin];

如果您需要将列标题作为查询的结果而不是手工组装,请查看动态SQL。