广告区
广告区
关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)
发布于2022-06-25 19:25 阅读(859) 评论(0) 点赞(16) 收藏(0)
我有一个按日期索引的数据框,它有四列,都是整数。
我的最终目标是制作另一个数据框,它也按日期索引,而不是有四列标量值,而是一个 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
其中数据的值是列值之间差异的组合。
然后我会为原始数据框中的每个日期制作这个二维数组
我一直在尝试在没有严重循环和事情的情况下做到这一点'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 的打印,我可以看到它被大量包裹在多个数组中。我想我错误地使用了外部函数。我想以正确的方式做到这一点,而不是使用丑陋的重塑技巧来提取(正确的)数据,但将其重新包装成正确的形状。
.iloc[0]
您可以通过选择第一行然后使用将 2D 输入数据帧转换为 1D 系列np.subtract.outer()
,如下所示 -
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]])
关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)
关注公众号回复python,免费领取 全套python视频,回复充值+你的账号,免费为您充值1000积分
作者:黑洞官方问答小能手
链接:https://www.pythonheidong.com/blog/article/1607333/893a344dfe22adcd7a98/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!