蟒蛇 - 转换大熊猫矩阵到数据帧
问题描述:
我创建了一个矩阵:蟒蛇 - 转换大熊猫矩阵到数据帧
items = [0, 1, 2, 3]
item_to_item = pd.DataFrame(index=items, columns=items)
我已经把值这么:
- 其对称的
- 其对角线为全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
答
这里有一个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
答
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开始。
你知道我是如何保持原有IDS?我注意到他们正在改变序列从0到len(项目) –
@EranMoshe如果你的意思是使用行索引,那么你可以这样做:'np.column_stack((item_to_item.index [r],item_to_item.index [c ],..))'。请让我知道这对你有没有用。 – Divakar
伟大的我的朋友! –