python - 将pandas Matrix转换为DataFrame

时间:2016-12-06 18:52:41

标签: python pandas numpy

我创建了一个矩阵:

items = [0, 1, 2, 3]
item_to_item = pd.DataFrame(index=items, columns=items)

我把值放在其中:

  1. 它的对称
  2. 它的对角线都是0
  3. 例如:

       0  1  2  3
    0  0  4  5  9
    1  4  0  3  7
    2  5  3  0  3
    3  9  7  3  0
    

    我想创建一个包含所有可能对的数据框(来自[0,1,2,3]),这样就不会有成对的(x, x)和if (x, y),我不会希望(y, x)因为它的对称性并保持相同的值。 最后,我将得到以下Dataframe(或numpy 2d数组)

    item, item, value
     0     1     4
     0     2     5
     0     3     9
     1     2     3
     1     3     7
     2     3     3
    

2 个答案:

答案 0 :(得分:2)

numpy的np.triu为您提供上三角形,其他所有元素都设置为零。您可以使用它来构造您的DataFrame并用NaN替换它们(以便在堆叠列时删除它们):

pd.DataFrame(np.triu(df), index=df.index, columns=df.columns).replace(0, np.nan).stack()
Out: 
0  1    4.0
   2    5.0
   3    9.0
1  2    3.0
   3    7.0
2  3    3.0
dtype: float64

您最后可以使用reset_index将索引转换为列。

另一个替代方法是重置索引并再次堆叠,但这次使用callable来切片DataFrame:

df.stack().reset_index()[lambda x: x['level_0'] < x['level_1']]
Out: 
    level_0  level_1  0
1         0        1  4
2         0        2  5
3         0        3  9
6         1        2  3
7         1        3  7
11        2        3  3

这个需要pandas 0.18.0。

答案 1 :(得分:2)

这是一个带有np.triu_indices -

的NumPy解决方案
In [453]: item_to_item
Out[453]: 
   0  1  2  3
0  0  4  5  9
1  4  0  3  7
2  5  3  0  3
3  9  7  3  0

In [454]: r,c = np.triu_indices(len(items),1)

In [455]: pd.DataFrame(np.column_stack((r,c, item_to_item.values[r,c])))
Out[455]: 
   0  1  2
0  0  1  4
1  0  2  5
2  0  3  9
3  1  2  3
4  1  3  7
5  2  3  3