将元组列表转换为以下形式的表的优雅方法是什么?
输入:
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
pivot
和fillna
是您想要的:
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
希望我错了,有一种更直接的方法可以做到这一点,但如果没有,你总是可以在元组上循环:
>>> 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而不是panda,我会注意到你的元组格式非常接近COO稀疏矩阵格式,所以:
>>> 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]]
然而,我不认为panda有"稀疏数据帧"的等价物,我也不知道仅仅为了构建转换回数据帧的结果数组而转换为原始数组会更"优雅"。(如果您可以对字母到数字的映射进行矢量化,可能会更高效,但这在这里可能无关紧要。)