如何从元组计数器创建DataFrame

时间:2017-12-06 12:02:50

标签: python python-2.7 pandas

我在pandas和其他scipy图书馆都很绿,所以我不知道该怎么做。我有一个双元素元组的列表,我正在计算找到相同元组的次数,或者相反的对应元组,因此排序:

In [24]: tuples
Out[24]:
[(1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4),
 (2, 1),
 (3, 1),
 (4, 1),
 (3, 2),
 (4, 2),
 (4, 3)]

In [30]: count = Counter([tuple(sorted(t)) for t in tuples])

In [31]: count
Out[31]: Counter({(1, 2): 2, (1, 3): 2, (1, 4): 2, (2, 3): 2, (2, 4): 2, (3, 4): 2})

我正在尝试创建一个基本上产生此输出的DataFrame

   1  2  3  4
1  0  2  2  2
2  2  0  2  2
3  2  2  0  2
4  2  2  2  0

1 个答案:

答案 0 :(得分:2)

略有不同的方法呢?

首先让我们从元组的分类列表中创建一个DF:

In [272]: df = pd.DataFrame(np.sort(np.array(tuples), axis=1), columns=['c1','c2'])

In [273]: df
Out[273]:
    c1  c2
0    1   2
1    1   3
2    1   4
3    2   3
4    2   4
5    3   4
6    1   2
7    1   3
8    1   4
9    2   3
10   2   4
11   3   4

现在我们可以使用Pandas技术计算对数:

In [274]: res = df.groupby(['c1','c2']).size()

In [275]: res
Out[275]:
c1  c2
1   2     2
    3     2
    4     2
2   3     2
    4     2
3   4     2
dtype: int64

访问多索引DF中的数据:

In [277]: res.loc[(1,2)]
Out[277]: 2

In [278]: res.loc[(2,4)]
Out[278]: 2

我们也可以拆开最终的DF,这将给我们提供:

In [279]: res.unstack(fill_value=0)
Out[279]:
c2  2  3  4
c1
1   2  2  2
2   0  2  2
3   0  0  2

as proposed by @Dark

In [280]: pd.Series(count).unstack(fill_value=0)
Out[280]:
   2  3  4
1  2  2  2
2  0  2  2
3  0  0  2