2016-12-06 127 views
1

我创建了一个矩阵:蟒蛇 - 转换大熊猫矩阵到数据帧

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

我已经把值这么:

  1. 其对称的
  2. 其对角线为全0

例如:

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)并且如果(x, y)是,我不想(y, x)监守其对称的并保持相同的价值。 最后,我将具有以下数据帧(或numpy的2D阵列)

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

回答

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 
+0

你知道我是如何保持原有IDS?我注意到他们正在改变序列从0到len(项目) –

+0

@EranMoshe如果你的意思是使用行索引,那么你可以这样做:'np.column_stack((item_to_item.index [r],item_to_item.index [c ],..))'。请让我知道这对你有没有用。 – Divakar

+1

伟大的我的朋友! –

2

numpy的的np.triu为您提供了设置为零的所有其他元素的上三角形。你可以用它来构建你的数据帧,并与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到指数转换成列。

另一种方法是重置索引并再次堆积,但这次使用一个可调用的切片数据框:

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 

这一个要求大熊猫0.18.0开始。