在python中以表格格式转换元组列表

时间:2014-10-28 21:39:02

标签: python pandas

以下列形式将元组列表转换为表格的优雅方法是什么?

输入:

from pandas import DataFrame
mytup = [('a','b',1), ('a','c',2), ('b','a',2), ('c','a',3), ('c','c',1)]

a       b       1
a       c       2
b       a       2
c       a       3
c       c       1

mydf = DataFrame(mytup, columns = ['from', 'to', 'val'])

输出:-可以替换为空白或nan

     a    b    c
a    -    1   2
b    2    -   -
c    3    -   1

2 个答案:

答案 0 :(得分:7)

pivotfillna就是您想要的:

import pandas as pd

mytup = [('a','b',1), ('a','c',2), ('b','a',2), ('c','a',3), ('c','c',1)]
mydf = pd.DataFrame(mytup, columns=['from', 'to', 'val'])
mydf.pivot(index='from', columns='to', values='val').fillna(value='-')

to    a  b  c
from         
a     -  1  2
b     2  -  -
c     3  -  1

答案 1 :(得分:0)

希望我错了,并且有更直接的方法来做到这一点,但如果没有,你总是可以循环遍历元组:

>>> df = DataFrame([['-'] * 3]*3, columns=['a', 'b', 'c'], index=['a', 'b', 'c'])
>>> for row, col, val in mytup:
...     df[col][row] = val
>>> df
   a  b  c
a  -  1  2
b  2  -  -
c  3  -  1

如果你只是处理numpy / scipy而不是pandas,我会注意到你的元组格式非常接近COO sparse matrix format,所以:

>>> tup = [(ord(x)-ord('a'), ord(y)-ord('a'), z) for x,y,z in mytup]
>>> x, y, values = zip(*tup)
>>> m = np.array(scipy.sparse.coo_matrix((values, (x, y))).todense())
>>> print(m)
[[0 1 2]
 [2 0 0]
 [3 0 1]]

但是,我不认为pandas相当于“稀疏数据帧”,我不知道转换为原始数组只是为了构建resulty数组转换回来会更“优雅”到数据框架。 (如果你可以进行矢量化的字母到数字映射可能会更有效,但这可能无关紧要。)