我想要一个这样的数组:
[['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。
任何帮助都会很棒!
感谢。
答案 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生成索引和列的笛卡尔积。 (在pandas
中pandas.tools.util.cartesian_product
)。没有pandas
,我们只需要使用标准库(itertools
)重新发明轮子......