以下列形式将元组列表转换为表格的优雅方法是什么?
输入:
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
答案 0 :(得分:7)
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
答案 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数组转换回来会更“优雅”到数据框架。 (如果你可以进行矢量化的字母到数字映射可能会更有效,但这可能无关紧要。)