我有一个按日期索引的数据框,有四列,全部是整数。
我的最终目标是创建另一个数据帧,它也按日期索引,而不是有四列标量值,是一个4x4数组,它具有四列之间差异的所有组合'该日期的价值观。
A B C D
1/1/2013 7 -1 1 2
我想制作一个看起来像的二维数组:
A B C D
7 -1 1 2
A 7 0 8 6 5
B -1 -8 0 -2 -3
C 1 -6 2 0 -1
D 2 -5 3 1 0
其中数据的值是列之间差异的组合'值。
然后我为原始数据框中的每个日期制作这个2d数组
我一直在努力做到这一点' pythonically / panda-ly'没有严重的循环和事情。
我提出了最简单的案例 - 原始数据框只有一行数据:
ddf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4)
A B C D
2013-01-02 7 -1 1 2
我将ddf输入
def makeRelativeChangeDF(deltaDF):
"""return array wit all the combinations of differences between columns"""
return np.subtract.outer(deltaDF, deltaDF)
返回:
rcdf is type <class 'pandas.core.frame.DataFrame'>, shape (1, 4)
[[[[ 0. 8. 6. 5.]]
[[-8. 0. -2. -3.]]
[[-6. 2. 0. -1.]]
[[-5. 3. 1. 0.]]]]
不确定为什么这会产生奇怪的形状(1,4)。我期待(4,4)。看看rcdf的印刷品,我可以看到它被多个阵列包裹着。我想我错误地使用了外部函数。我想以正确的方式做到这一点,而不是使用丑陋的重塑黑客来拉出(正确的)数据,但重新打包成正确的形状。
答案 0 :(得分:1)
您可以通过选择.iloc[0]
的第一行然后使用np.subtract.outer()
将2D输入数据帧转换为1D系列,就像这样 -
np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0])
您似乎也可以使用broadcasting
-
deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:]
示例运行 -
In [107]: type(deltaDF)
Out[107]: pandas.core.frame.DataFrame
In [108]: np.subtract.outer(deltaDF.iloc[0],deltaDF.iloc[0])
Out[108]:
array([[ 0, 8, 6, 5],
[-8, 0, -2, -3],
[-6, 2, 0, -1],
[-5, 3, 1, 0]])
In [109]: deltaDF.iloc[0][:,None] - deltaDF.iloc[0][None,:]
Out[109]:
array([[ 0, 8, 6, 5],
[-8, 0, -2, -3],
[-6, 2, 0, -1],
[-5, 3, 1, 0]])