我创建了一个矩阵:
items = [0, 1, 2, 3]
item_to_item = pd.DataFrame(index=items, columns=items)
我把值放在其中:
例如:
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
答案 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
-
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