没有Pandas的Python数据透视表?

时间:2016-02-17 18:27:57

标签: python google-app-engine numpy pandas

我想要一个这样的数组:

[['1.6.2', '2016-01-11', 10], ['1.6.2', '2016-01-12', 100], ['1.6.2', '2016-01-13', 200], ['1.6.3', '2016-01-11', 300], ['1.6.3', '2016-01-12', 10], ['1.6.3', '2016-01-13', 21]]

我希望得到一些看起来像的东西:

AV          1.6.2  1.6.3
DAY
2016-01-11     10    300
2016-01-12    100     10
2016-01-13    200     21

所以out数组就像:

[[“Day”, “1.6.2”, “1.6.3”], [“2016-01-11”, 10, 300], [2015-01-12, 100, 10, [‘2016-01-13, 200, 21’]]]

我可以在熊猫中做到这一点:

df = pd.DataFrame(dd, columns=['AV', 'DAY', 'COUNT'])

pivot_table(df, values='COUNT', rows='DAY', cols='AV')

但是,我不能使用Pandas,因为Appengine不支持......

我需要帮助来解决这个问题。我可以使用其他只有Python的库,或者Numpy。

任何帮助都会很棒!

感谢。

1 个答案:

答案 0 :(得分:1)

我们可以假设价值组合是独一无二的吗?即组合'1.6.2', '2016-01-11'最多只出现一次?如果是这样,我们可以使用查找字典:

In [69]:

#make it into an array
a_dd  = np.array(dd)
a_dd
Out[69]:
array([['1.6.2', '2016-01-11', '10'],
       ['1.6.2', '2016-01-12', '100'],
       ['1.6.2', '2016-01-13', '200'],
       ['1.6.3', '2016-01-11', '300'],
       ['1.6.3', '2016-01-12', '10'],
       ['1.6.3', '2016-01-13', '21']], 
      dtype='|S10')
In [70]:

#the combinations of unique values:
#get the uniques
u_av  = np.unique(np.array(a_dd[:,1]))
u_day = np.unique(np.array(a_dd[:,0]))
​
#the combinations of unique values:
list(itertools.product(u_av, 
                       u_day))
Out[70]:
[('2016-01-11', '1.6.2'),
 ('2016-01-11', '1.6.3'),
 ('2016-01-12', '1.6.2'),
 ('2016-01-12', '1.6.3'),
 ('2016-01-13', '1.6.2'),
 ('2016-01-13', '1.6.3')]

字典查找:

In [71]:

#a lookup distionary
D = dict(zip(map(tuple, a_dd[:,[0,1]]),
             a_dd[:,[2]].ravel().tolist()))
D
Out[71]:
{('1.6.2', '2016-01-11'): '10',
 ('1.6.2', '2016-01-12'): '100',
 ('1.6.2', '2016-01-13'): '200',
 ('1.6.3', '2016-01-11'): '300',
 ('1.6.3', '2016-01-12'): '10',
 ('1.6.3', '2016-01-13'): '21'}
In [72]:

in 
#pivot table
#if a certain combination is not found, it will result in a None
np.array(map(D.get, itertools.product(u_day, 
                                      u_av))).reshape(len(u_day), len(u_av))
Out[72]:
array([['10', '100', '200'],
       ['300', '10', '21']], 
      dtype='|S3')

我们必须首先为生成的pivot_table生成索引和列的笛卡尔积。 (在pandaspandas.tools.util.cartesian_product)。没有pandas,我们只需要使用标准库(itertools)重新发明轮子......